//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2022 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

import Foundation
import SotoCore

extension IoTFleetWise {
    // MARK: Enums

    public enum CampaignStatus: String, CustomStringConvertible, Codable, _SotoSendable {
        case creating = "CREATING"
        case running = "RUNNING"
        case suspended = "SUSPENDED"
        case waitingForApproval = "WAITING_FOR_APPROVAL"
        public var description: String { return self.rawValue }
    }

    public enum Compression: String, CustomStringConvertible, Codable, _SotoSendable {
        case off = "OFF"
        case snappy = "SNAPPY"
        public var description: String { return self.rawValue }
    }

    public enum DiagnosticsMode: String, CustomStringConvertible, Codable, _SotoSendable {
        case off = "OFF"
        case sendActiveDtcs = "SEND_ACTIVE_DTCS"
        public var description: String { return self.rawValue }
    }

    public enum LogType: String, CustomStringConvertible, Codable, _SotoSendable {
        case error = "ERROR"
        case off = "OFF"
        public var description: String { return self.rawValue }
    }

    public enum ManifestStatus: String, CustomStringConvertible, Codable, _SotoSendable {
        case active = "ACTIVE"
        case draft = "DRAFT"
        public var description: String { return self.rawValue }
    }

    public enum NetworkInterfaceType: String, CustomStringConvertible, Codable, _SotoSendable {
        case canInterface = "CAN_INTERFACE"
        case obdInterface = "OBD_INTERFACE"
        public var description: String { return self.rawValue }
    }

    public enum NodeDataType: String, CustomStringConvertible, Codable, _SotoSendable {
        case boolean = "BOOLEAN"
        case booleanArray = "BOOLEAN_ARRAY"
        case double = "DOUBLE"
        case doubleArray = "DOUBLE_ARRAY"
        case float = "FLOAT"
        case floatArray = "FLOAT_ARRAY"
        case int16 = "INT16"
        case int16Array = "INT16_ARRAY"
        case int32 = "INT32"
        case int32Array = "INT32_ARRAY"
        case int64 = "INT64"
        case int64Array = "INT64_ARRAY"
        case int8 = "INT8"
        case int8Array = "INT8_ARRAY"
        case string = "STRING"
        case stringArray = "STRING_ARRAY"
        case uint16 = "UINT16"
        case uint16Array = "UINT16_ARRAY"
        case uint32 = "UINT32"
        case uint32Array = "UINT32_ARRAY"
        case uint64 = "UINT64"
        case uint64Array = "UINT64_ARRAY"
        case uint8 = "UINT8"
        case uint8Array = "UINT8_ARRAY"
        case unixTimestamp = "UNIX_TIMESTAMP"
        case unixTimestampArray = "UNIX_TIMESTAMP_ARRAY"
        case unknown = "UNKNOWN"
        public var description: String { return self.rawValue }
    }

    public enum RegistrationStatus: String, CustomStringConvertible, Codable, _SotoSendable {
        case registrationFailure = "REGISTRATION_FAILURE"
        case registrationPending = "REGISTRATION_PENDING"
        case registrationSuccess = "REGISTRATION_SUCCESS"
        public var description: String { return self.rawValue }
    }

    public enum SignalDecoderType: String, CustomStringConvertible, Codable, _SotoSendable {
        case canSignal = "CAN_SIGNAL"
        case obdSignal = "OBD_SIGNAL"
        public var description: String { return self.rawValue }
    }

    public enum SpoolingMode: String, CustomStringConvertible, Codable, _SotoSendable {
        case off = "OFF"
        case toDisk = "TO_DISK"
        public var description: String { return self.rawValue }
    }

    public enum TriggerMode: String, CustomStringConvertible, Codable, _SotoSendable {
        case always = "ALWAYS"
        case risingEdge = "RISING_EDGE"
        public var description: String { return self.rawValue }
    }

    public enum UpdateCampaignAction: String, CustomStringConvertible, Codable, _SotoSendable {
        case approve = "APPROVE"
        case resume = "RESUME"
        case suspend = "SUSPEND"
        case update = "UPDATE"
        public var description: String { return self.rawValue }
    }

    public enum UpdateMode: String, CustomStringConvertible, Codable, _SotoSendable {
        case merge = "Merge"
        case overwrite = "Overwrite"
        public var description: String { return self.rawValue }
    }

    public enum VehicleAssociationBehavior: String, CustomStringConvertible, Codable, _SotoSendable {
        case createIotThing = "CreateIotThing"
        case validateIotThingExists = "ValidateIotThingExists"
        public var description: String { return self.rawValue }
    }

    public enum VehicleState: String, CustomStringConvertible, Codable, _SotoSendable {
        case created = "CREATED"
        case deleting = "DELETING"
        case healthy = "HEALTHY"
        case ready = "READY"
        case suspended = "SUSPENDED"
        public var description: String { return self.rawValue }
    }

    public enum CollectionScheme: AWSEncodableShape & AWSDecodableShape, _SotoSendable {
        /// Information about a collection scheme that uses a simple logical expression to recognize what data to collect.
        case conditionBasedCollectionScheme(ConditionBasedCollectionScheme)
        /// Information about a collection scheme that uses a time period to decide how often to collect data.
        case timeBasedCollectionScheme(TimeBasedCollectionScheme)

        public init(from decoder: Decoder) throws {
            let container = try decoder.container(keyedBy: CodingKeys.self)
            guard container.allKeys.count == 1, let key = container.allKeys.first else {
                let context = DecodingError.Context(
                    codingPath: container.codingPath,
                    debugDescription: "Expected exactly one key, but got \(container.allKeys.count)"
                )
                throw DecodingError.dataCorrupted(context)
            }
            switch key {
            case .conditionBasedCollectionScheme:
                let value = try container.decode(ConditionBasedCollectionScheme.self, forKey: .conditionBasedCollectionScheme)
                self = .conditionBasedCollectionScheme(value)
            case .timeBasedCollectionScheme:
                let value = try container.decode(TimeBasedCollectionScheme.self, forKey: .timeBasedCollectionScheme)
                self = .timeBasedCollectionScheme(value)
            }
        }

        public func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            switch self {
            case .conditionBasedCollectionScheme(let value):
                try container.encode(value, forKey: .conditionBasedCollectionScheme)
            case .timeBasedCollectionScheme(let value):
                try container.encode(value, forKey: .timeBasedCollectionScheme)
            }
        }

        public func validate(name: String) throws {
            switch self {
            case .conditionBasedCollectionScheme(let value):
                try value.validate(name: "\(name).conditionBasedCollectionScheme")
            case .timeBasedCollectionScheme(let value):
                try value.validate(name: "\(name).timeBasedCollectionScheme")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case conditionBasedCollectionScheme
            case timeBasedCollectionScheme
        }
    }

    public enum Node: AWSEncodableShape & AWSDecodableShape, _SotoSendable {
        /// Information about a node specified as an actuator.  An actuator is a digital representation of a vehicle device.
        case actuator(Actuator)
        /// Information about a node specified as an attribute.  An attribute represents static information about a vehicle.
        case attribute(Attribute)
        /// Information about a node specified as a branch.  A group of signals that are defined in a hierarchical structure.
        case branch(Branch)
        case sensor(Sensor)

        public init(from decoder: Decoder) throws {
            let container = try decoder.container(keyedBy: CodingKeys.self)
            guard container.allKeys.count == 1, let key = container.allKeys.first else {
                let context = DecodingError.Context(
                    codingPath: container.codingPath,
                    debugDescription: "Expected exactly one key, but got \(container.allKeys.count)"
                )
                throw DecodingError.dataCorrupted(context)
            }
            switch key {
            case .actuator:
                let value = try container.decode(Actuator.self, forKey: .actuator)
                self = .actuator(value)
            case .attribute:
                let value = try container.decode(Attribute.self, forKey: .attribute)
                self = .attribute(value)
            case .branch:
                let value = try container.decode(Branch.self, forKey: .branch)
                self = .branch(value)
            case .sensor:
                let value = try container.decode(Sensor.self, forKey: .sensor)
                self = .sensor(value)
            }
        }

        public func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            switch self {
            case .actuator(let value):
                try container.encode(value, forKey: .actuator)
            case .attribute(let value):
                try container.encode(value, forKey: .attribute)
            case .branch(let value):
                try container.encode(value, forKey: .branch)
            case .sensor(let value):
                try container.encode(value, forKey: .sensor)
            }
        }

        public func validate(name: String) throws {
            switch self {
            case .actuator(let value):
                try value.validate(name: "\(name).actuator")
            case .attribute(let value):
                try value.validate(name: "\(name).attribute")
            case .branch(let value):
                try value.validate(name: "\(name).branch")
            case .sensor(let value):
                try value.validate(name: "\(name).sensor")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case actuator
            case attribute
            case branch
            case sensor
        }
    }

    // MARK: Shapes

    public struct Actuator: AWSEncodableShape & AWSDecodableShape {
        /// A list of possible values an actuator can take.
        public let allowedValues: [String]?
        /// A specified value for the actuator.
        public let assignedValue: String?
        /// The specified data type of the actuator.
        public let dataType: NodeDataType
        /// A brief description of the actuator.
        public let description: String?
        /// The fully qualified name of the actuator. For example, the fully qualified name of an actuator might be Vehicle.Front.Left.Door.Lock.
        public let fullyQualifiedName: String
        /// The specified possible maximum value of an actuator.
        public let max: Double?
        /// The specified possible minimum value of an actuator.
        public let min: Double?
        /// The scientific unit for the actuator.
        public let unit: String?

        public init(allowedValues: [String]? = nil, dataType: NodeDataType, description: String? = nil, fullyQualifiedName: String, max: Double? = nil, min: Double? = nil, unit: String? = nil) {
            self.allowedValues = allowedValues
            self.assignedValue = nil
            self.dataType = dataType
            self.description = description
            self.fullyQualifiedName = fullyQualifiedName
            self.max = max
            self.min = min
            self.unit = unit
        }

        @available(*, deprecated, message: "Members assignedValue have been deprecated")
        public init(allowedValues: [String]? = nil, assignedValue: String? = nil, dataType: NodeDataType, description: String? = nil, fullyQualifiedName: String, max: Double? = nil, min: Double? = nil, unit: String? = nil) {
            self.allowedValues = allowedValues
            self.assignedValue = assignedValue
            self.dataType = dataType
            self.description = description
            self.fullyQualifiedName = fullyQualifiedName
            self.max = max
            self.min = min
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case allowedValues
            case assignedValue
            case dataType
            case description
            case fullyQualifiedName
            case max
            case min
            case unit
        }
    }

    public struct AssociateVehicleFleetRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "vehicleName", location: .uri("vehicleName"))
        ]

        ///  The ID of a fleet.
        public let fleetId: String
        ///  The unique ID of the vehicle to associate with the fleet.
        public let vehicleName: String

        public init(fleetId: String, vehicleName: String) {
            self.fleetId = fleetId
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.validate(self.fleetId, name: "fleetId", parent: name, max: 100)
            try self.validate(self.fleetId, name: "fleetId", parent: name, min: 1)
            try self.validate(self.fleetId, name: "fleetId", parent: name, pattern: "^[a-zA-Z0-9:_-]+$")
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case fleetId
        }
    }

    public struct AssociateVehicleFleetResponse: AWSDecodableShape {
        public init() {}
    }

    public struct Attribute: AWSEncodableShape & AWSDecodableShape {
        /// A list of possible values an attribute can be assigned.
        public let allowedValues: [String]?
        /// A specified value for the attribute.
        public let assignedValue: String?
        /// The specified data type of the attribute.
        public let dataType: NodeDataType
        /// The default value of the attribute.
        public let defaultValue: String?
        /// A brief description of the attribute.
        public let description: String?
        /// The fully qualified name of the attribute. For example, the fully qualified name of an attribute might be Vehicle.Body.Engine.Type.
        public let fullyQualifiedName: String
        /// The specified possible maximum value of the attribute.
        public let max: Double?
        /// The specified possible minimum value of the attribute.
        public let min: Double?
        /// The scientific unit for the attribute.
        public let unit: String?

        public init(allowedValues: [String]? = nil, dataType: NodeDataType, defaultValue: String? = nil, description: String? = nil, fullyQualifiedName: String, max: Double? = nil, min: Double? = nil, unit: String? = nil) {
            self.allowedValues = allowedValues
            self.assignedValue = nil
            self.dataType = dataType
            self.defaultValue = defaultValue
            self.description = description
            self.fullyQualifiedName = fullyQualifiedName
            self.max = max
            self.min = min
            self.unit = unit
        }

        @available(*, deprecated, message: "Members assignedValue have been deprecated")
        public init(allowedValues: [String]? = nil, assignedValue: String? = nil, dataType: NodeDataType, defaultValue: String? = nil, description: String? = nil, fullyQualifiedName: String, max: Double? = nil, min: Double? = nil, unit: String? = nil) {
            self.allowedValues = allowedValues
            self.assignedValue = assignedValue
            self.dataType = dataType
            self.defaultValue = defaultValue
            self.description = description
            self.fullyQualifiedName = fullyQualifiedName
            self.max = max
            self.min = min
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case allowedValues
            case assignedValue
            case dataType
            case defaultValue
            case description
            case fullyQualifiedName
            case max
            case min
            case unit
        }
    }

    public struct BatchCreateVehicleRequest: AWSEncodableShape {
        ///  A list of information about each vehicle to create. For more information, see the API data type.
        public let vehicles: [CreateVehicleRequestItem]

        public init(vehicles: [CreateVehicleRequestItem]) {
            self.vehicles = vehicles
        }

        public func validate(name: String) throws {
            try self.vehicles.forEach {
                try $0.validate(name: "\(name).vehicles[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case vehicles
        }
    }

    public struct BatchCreateVehicleResponse: AWSDecodableShape {
        /// A list of information about creation errors, or an empty list if there aren't any errors.
        public let errors: [CreateVehicleError]?
        ///  A list of information about a batch of created vehicles. For more information, see the  API data type.
        public let vehicles: [CreateVehicleResponseItem]?

        public init(errors: [CreateVehicleError]? = nil, vehicles: [CreateVehicleResponseItem]? = nil) {
            self.errors = errors
            self.vehicles = vehicles
        }

        private enum CodingKeys: String, CodingKey {
            case errors
            case vehicles
        }
    }

    public struct BatchUpdateVehicleRequest: AWSEncodableShape {
        ///  A list of information about the vehicles to update. For more information, see the API data type.
        public let vehicles: [UpdateVehicleRequestItem]

        public init(vehicles: [UpdateVehicleRequestItem]) {
            self.vehicles = vehicles
        }

        public func validate(name: String) throws {
            try self.vehicles.forEach {
                try $0.validate(name: "\(name).vehicles[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case vehicles
        }
    }

    public struct BatchUpdateVehicleResponse: AWSDecodableShape {
        /// A list of information about errors returned while updating a batch of vehicles, or, if there aren't any errors, an empty list.
        public let errors: [UpdateVehicleError]?
        ///  A list of information about the batch of updated vehicles.   This list contains only unique IDs for the vehicles that were updated.
        public let vehicles: [UpdateVehicleResponseItem]?

        public init(errors: [UpdateVehicleError]? = nil, vehicles: [UpdateVehicleResponseItem]? = nil) {
            self.errors = errors
            self.vehicles = vehicles
        }

        private enum CodingKeys: String, CodingKey {
            case errors
            case vehicles
        }
    }

    public struct Branch: AWSEncodableShape & AWSDecodableShape {
        /// A brief description of the branch.
        public let description: String?
        /// The fully qualified name of the branch. For example, the fully qualified name of a branch might be Vehicle.Body.Engine.
        public let fullyQualifiedName: String

        public init(description: String? = nil, fullyQualifiedName: String) {
            self.description = description
            self.fullyQualifiedName = fullyQualifiedName
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case fullyQualifiedName
        }
    }

    public struct CampaignSummary: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of a campaign.
        public let arn: String?
        /// The time the campaign was created.
        public let creationTime: Date
        /// The description of the campaign.
        public let description: String?
        /// The last time the campaign was modified.
        public let lastModificationTime: Date
        /// The name of a campaign.
        public let name: String?
        /// The ARN of the signal catalog associated with the campaign.
        public let signalCatalogArn: String?
        /// The state of a campaign. The status can be one of the following:    CREATING - Amazon Web Services IoT FleetWise is processing your request to create the campaign.    WAITING_FOR_APPROVAL - After a campaign is created, it enters the WAITING_FOR_APPROVAL state. To allow Amazon Web Services IoT FleetWise to deploy the campaign to the target vehicle or fleet, use the  API operation to approve the campaign.     RUNNING - The campaign is active.     SUSPENDED - The campaign is suspended. To resume the campaign, use the  API operation.
        public let status: CampaignStatus?
        /// The ARN of a vehicle or fleet to which the campaign is deployed.
        public let targetArn: String?

        public init(arn: String? = nil, creationTime: Date, description: String? = nil, lastModificationTime: Date, name: String? = nil, signalCatalogArn: String? = nil, status: CampaignStatus? = nil, targetArn: String? = nil) {
            self.arn = arn
            self.creationTime = creationTime
            self.description = description
            self.lastModificationTime = lastModificationTime
            self.name = name
            self.signalCatalogArn = signalCatalogArn
            self.status = status
            self.targetArn = targetArn
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case description
            case lastModificationTime
            case name
            case signalCatalogArn
            case status
            case targetArn
        }
    }

    public struct CanDbcDefinition: AWSEncodableShape {
        /// A list of DBC files. You can upload only one DBC file for each network interface and specify up to five (inclusive) files in the list.
        public let canDbcFiles: [AWSBase64Data]
        /// Contains information about a network interface.
        public let networkInterface: String
        /// Pairs every signal specified in your vehicle model with a signal decoder.
        public let signalsMap: [String: String]?

        public init(canDbcFiles: [AWSBase64Data], networkInterface: String, signalsMap: [String: String]? = nil) {
            self.canDbcFiles = canDbcFiles
            self.networkInterface = networkInterface
            self.signalsMap = signalsMap
        }

        public func validate(name: String) throws {
            try self.validate(self.canDbcFiles, name: "canDbcFiles", parent: name, max: 5)
            try self.validate(self.canDbcFiles, name: "canDbcFiles", parent: name, min: 1)
            try self.validate(self.networkInterface, name: "networkInterface", parent: name, max: 50)
            try self.validate(self.networkInterface, name: "networkInterface", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case canDbcFiles
            case networkInterface
            case signalsMap
        }
    }

    public struct CanInterface: AWSEncodableShape & AWSDecodableShape {
        /// The unique name of the interface.
        public let name: String
        /// The name of the communication protocol for the interface.
        public let protocolName: String?
        /// The version of the communication protocol for the interface.
        public let protocolVersion: String?

        public init(name: String, protocolName: String? = nil, protocolVersion: String? = nil) {
            self.name = name
            self.protocolName = protocolName
            self.protocolVersion = protocolVersion
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.protocolName, name: "protocolName", parent: name, max: 50)
            try self.validate(self.protocolName, name: "protocolName", parent: name, min: 1)
            try self.validate(self.protocolVersion, name: "protocolVersion", parent: name, max: 50)
            try self.validate(self.protocolVersion, name: "protocolVersion", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case name
            case protocolName
            case protocolVersion
        }
    }

    public struct CanSignal: AWSEncodableShape & AWSDecodableShape {
        /// A multiplier used to decode the CAN message.
        public let factor: Double
        /// Whether the byte ordering of a CAN message is big-endian.
        public let isBigEndian: Bool
        /// Whether the message data is specified as a signed value.
        public let isSigned: Bool
        /// How many bytes of data are in the message.
        public let length: Int
        /// The ID of the message.
        public let messageId: Int
        /// The name of the signal.
        public let name: String?
        /// Indicates where data appears in the CAN message.
        public let offset: Double
        /// Indicates the beginning of the CAN message.
        public let startBit: Int

        public init(factor: Double, isBigEndian: Bool, isSigned: Bool, length: Int, messageId: Int, name: String? = nil, offset: Double, startBit: Int) {
            self.factor = factor
            self.isBigEndian = isBigEndian
            self.isSigned = isSigned
            self.length = length
            self.messageId = messageId
            self.name = name
            self.offset = offset
            self.startBit = startBit
        }

        public func validate(name: String) throws {
            try self.validate(self.length, name: "length", parent: name, min: 0)
            try self.validate(self.messageId, name: "messageId", parent: name, min: 0)
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.startBit, name: "startBit", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case factor
            case isBigEndian
            case isSigned
            case length
            case messageId
            case name
            case offset
            case startBit
        }
    }

    public struct CloudWatchLogDeliveryOptions: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon CloudWatch Logs group the operation sends data to.
        public let logGroupName: String?
        /// The type of log to send data to Amazon CloudWatch Logs.
        public let logType: LogType

        public init(logGroupName: String? = nil, logType: LogType) {
            self.logGroupName = logGroupName
            self.logType = logType
        }

        public func validate(name: String) throws {
            try self.validate(self.logGroupName, name: "logGroupName", parent: name, max: 512)
            try self.validate(self.logGroupName, name: "logGroupName", parent: name, min: 1)
            try self.validate(self.logGroupName, name: "logGroupName", parent: name, pattern: "^[\\.\\-_\\/#A-Za-z0-9]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case logGroupName
            case logType
        }
    }

    public struct ConditionBasedCollectionScheme: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the version of the conditional expression language.
        public let conditionLanguageVersion: Int?
        /// The logical expression used to recognize what data to collect. For example, $variable.Vehicle.OutsideAirTemperature &gt;= 105.0.
        public let expression: String
        /// The minimum duration of time between two triggering events to collect data, in milliseconds.  If a signal changes often, you might want to collect data at a slower rate.
        public let minimumTriggerIntervalMs: Int64?
        /// Whether to collect data for all triggering events (ALWAYS). Specify (RISING_EDGE), or specify only when the condition first evaluates to false. For example, triggering on "AirbagDeployed"; Users aren't interested on triggering when the airbag is already exploded; they only care about the change from not deployed =&gt; deployed.
        public let triggerMode: TriggerMode?

        public init(conditionLanguageVersion: Int? = nil, expression: String, minimumTriggerIntervalMs: Int64? = nil, triggerMode: TriggerMode? = nil) {
            self.conditionLanguageVersion = conditionLanguageVersion
            self.expression = expression
            self.minimumTriggerIntervalMs = minimumTriggerIntervalMs
            self.triggerMode = triggerMode
        }

        public func validate(name: String) throws {
            try self.validate(self.conditionLanguageVersion, name: "conditionLanguageVersion", parent: name, min: 1)
            try self.validate(self.expression, name: "expression", parent: name, max: 2048)
            try self.validate(self.expression, name: "expression", parent: name, min: 1)
            try self.validate(self.minimumTriggerIntervalMs, name: "minimumTriggerIntervalMs", parent: name, max: 4_294_967_295)
            try self.validate(self.minimumTriggerIntervalMs, name: "minimumTriggerIntervalMs", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case conditionLanguageVersion
            case expression
            case minimumTriggerIntervalMs
            case triggerMode
        }
    }

    public struct CreateCampaignRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The data collection scheme associated with the campaign. You can specify a scheme that collects data based on time or an event.
        public let collectionScheme: CollectionScheme
        ///  (Optional) Whether to compress signals before transmitting data to Amazon Web Services IoT FleetWise. If you don't want to compress the signals, use OFF. If it's not specified, SNAPPY is used.  Default: SNAPPY
        public let compression: Compression?
        ///  (Optional) A list of vehicle attributes to associate with a campaign.  Enrich the data with specified vehicle attributes. For example, add make and model to the campaign, and Amazon Web Services IoT FleetWise will associate the data with those attributes as dimensions in Amazon Timestream. You can then query the data against make and model. Default: An empty array
        public let dataExtraDimensions: [String]?
        /// An optional description of the campaign to help identify its purpose.
        public let description: String?
        ///  (Optional) Option for a vehicle to send diagnostic trouble codes to Amazon Web Services IoT FleetWise. If you want to send diagnostic trouble codes, use SEND_ACTIVE_DTCS. If it's not specified, OFF is used. Default: OFF
        public let diagnosticsMode: DiagnosticsMode?
        ///  (Optional) The time the campaign expires, in seconds since epoch (January 1, 1970 at midnight UTC time). Vehicle data won't be collected after the campaign expires.  Default: 253402214400 (December 31, 9999, 00:00:00 UTC)
        public let expiryTime: Date?
        ///  The name of the campaign to create.
        public let name: String
        ///  (Optional) How long (in milliseconds) to collect raw data after a triggering event initiates the collection. If it's not specified, 0 is used. Default: 0
        public let postTriggerCollectionDuration: Int64?
        /// (Optional) A number indicating the priority of one campaign over another campaign for a certain vehicle or fleet. A campaign with the lowest value is deployed to vehicles before any other campaigns. If it's not specified, 0 is used.  Default: 0
        public let priority: Int?
        /// (Optional) The Amazon Resource Name (ARN) of the signal catalog to associate with the campaign.
        public let signalCatalogArn: String
        /// (Optional) A list of information about signals to collect.
        public let signalsToCollect: [SignalInformation]?
        /// (Optional) Whether to store collected data after a vehicle lost a connection with the cloud. After a connection is re-established, the data is automatically forwarded to Amazon Web Services IoT FleetWise. If you want to store collected data when a vehicle loses connection with the cloud, use TO_DISK. If it's not specified, OFF is used. Default: OFF
        public let spoolingMode: SpoolingMode?
        /// (Optional) The time, in milliseconds, to deliver a campaign after it was approved. If it's not specified, 0 is used. Default: 0
        public let startTime: Date?
        /// Metadata that can be used to manage the campaign.
        public let tags: [Tag]?
        ///  The ARN of the vehicle or fleet to deploy a campaign to.
        public let targetArn: String

        public init(collectionScheme: CollectionScheme, compression: Compression? = nil, dataExtraDimensions: [String]? = nil, description: String? = nil, diagnosticsMode: DiagnosticsMode? = nil, expiryTime: Date? = nil, name: String, postTriggerCollectionDuration: Int64? = nil, priority: Int? = nil, signalCatalogArn: String, signalsToCollect: [SignalInformation]? = nil, spoolingMode: SpoolingMode? = nil, startTime: Date? = nil, tags: [Tag]? = nil, targetArn: String) {
            self.collectionScheme = collectionScheme
            self.compression = compression
            self.dataExtraDimensions = dataExtraDimensions
            self.description = description
            self.diagnosticsMode = diagnosticsMode
            self.expiryTime = expiryTime
            self.name = name
            self.postTriggerCollectionDuration = postTriggerCollectionDuration
            self.priority = priority
            self.signalCatalogArn = signalCatalogArn
            self.signalsToCollect = signalsToCollect
            self.spoolingMode = spoolingMode
            self.startTime = startTime
            self.tags = tags
            self.targetArn = targetArn
        }

        public func validate(name: String) throws {
            try self.collectionScheme.validate(name: "\(name).collectionScheme")
            try self.dataExtraDimensions?.forEach {
                try validate($0, name: "dataExtraDimensions[]", parent: name, max: 150)
                try validate($0, name: "dataExtraDimensions[]", parent: name, min: 1)
                try validate($0, name: "dataExtraDimensions[]", parent: name, pattern: "^[a-zA-Z0-9_.]+$")
            }
            try self.validate(self.dataExtraDimensions, name: "dataExtraDimensions", parent: name, max: 5)
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.validate(self.postTriggerCollectionDuration, name: "postTriggerCollectionDuration", parent: name, max: 4_294_967_295)
            try self.validate(self.postTriggerCollectionDuration, name: "postTriggerCollectionDuration", parent: name, min: 0)
            try self.validate(self.priority, name: "priority", parent: name, min: 0)
            try self.signalsToCollect?.forEach {
                try $0.validate(name: "\(name).signalsToCollect[]")
            }
            try self.validate(self.signalsToCollect, name: "signalsToCollect", parent: name, max: 1000)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionScheme
            case compression
            case dataExtraDimensions
            case description
            case diagnosticsMode
            case expiryTime
            case postTriggerCollectionDuration
            case priority
            case signalCatalogArn
            case signalsToCollect
            case spoolingMode
            case startTime
            case tags
            case targetArn
        }
    }

    public struct CreateCampaignResponse: AWSDecodableShape {
        ///  The ARN of the created campaign.
        public let arn: String?
        /// The name of the created campaign.
        public let name: String?

        public init(arn: String? = nil, name: String? = nil) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct CreateDecoderManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  A brief description of the decoder manifest.
        public let description: String?
        ///  The Amazon Resource Name (ARN) of the vehicle model (model manifest).
        public let modelManifestArn: String
        ///  The unique name of the decoder manifest to create.
        public let name: String
        ///  A list of information about available network interfaces.
        public let networkInterfaces: [NetworkInterface]?
        ///  A list of information about signal decoders.
        public let signalDecoders: [SignalDecoder]?
        /// Metadata that can be used to manage the decoder manifest.
        public let tags: [Tag]?

        public init(description: String? = nil, modelManifestArn: String, name: String, networkInterfaces: [NetworkInterface]? = nil, signalDecoders: [SignalDecoder]? = nil, tags: [Tag]? = nil) {
            self.description = description
            self.modelManifestArn = modelManifestArn
            self.name = name
            self.networkInterfaces = networkInterfaces
            self.signalDecoders = signalDecoders
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.networkInterfaces?.forEach {
                try $0.validate(name: "\(name).networkInterfaces[]")
            }
            try self.validate(self.networkInterfaces, name: "networkInterfaces", parent: name, max: 500)
            try self.validate(self.networkInterfaces, name: "networkInterfaces", parent: name, min: 1)
            try self.signalDecoders?.forEach {
                try $0.validate(name: "\(name).signalDecoders[]")
            }
            try self.validate(self.signalDecoders, name: "signalDecoders", parent: name, max: 500)
            try self.validate(self.signalDecoders, name: "signalDecoders", parent: name, min: 1)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case modelManifestArn
            case networkInterfaces
            case signalDecoders
            case tags
        }
    }

    public struct CreateDecoderManifestResponse: AWSDecodableShape {
        ///  The ARN of the created decoder manifest.
        public let arn: String
        ///  The name of the created decoder manifest.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct CreateFleetRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "fleetId", location: .uri("fleetId"))
        ]

        ///  A brief description of the fleet to create.
        public let description: String?
        ///  The unique ID of the fleet to create.
        public let fleetId: String
        ///  The Amazon Resource Name (ARN) of a signal catalog.
        public let signalCatalogArn: String
        /// Metadata that can be used to manage the fleet.
        public let tags: [Tag]?

        public init(description: String? = nil, fleetId: String, signalCatalogArn: String, tags: [Tag]? = nil) {
            self.description = description
            self.fleetId = fleetId
            self.signalCatalogArn = signalCatalogArn
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.fleetId, name: "fleetId", parent: name, max: 100)
            try self.validate(self.fleetId, name: "fleetId", parent: name, min: 1)
            try self.validate(self.fleetId, name: "fleetId", parent: name, pattern: "^[a-zA-Z0-9:_-]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case signalCatalogArn
            case tags
        }
    }

    public struct CreateFleetResponse: AWSDecodableShape {
        ///  The ARN of the created fleet.
        public let arn: String
        ///  The ID of the created fleet.
        public let id: String

        public init(arn: String, id: String) {
            self.arn = arn
            self.id = id
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case id
        }
    }

    public struct CreateModelManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  A brief description of the vehicle model.
        public let description: String?
        ///  The name of the vehicle model to create.
        public let name: String
        ///  A list of nodes, which are a general abstraction of signals.
        public let nodes: [String]
        ///  The Amazon Resource Name (ARN) of a signal catalog.
        public let signalCatalogArn: String
        /// Metadata that can be used to manage the vehicle model.
        public let tags: [Tag]?

        public init(description: String? = nil, name: String, nodes: [String], signalCatalogArn: String, tags: [Tag]? = nil) {
            self.description = description
            self.name = name
            self.nodes = nodes
            self.signalCatalogArn = signalCatalogArn
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case nodes
            case signalCatalogArn
            case tags
        }
    }

    public struct CreateModelManifestResponse: AWSDecodableShape {
        ///  The ARN of the created vehicle model.
        public let arn: String
        ///  The name of the created vehicle model.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct CreateSignalCatalogRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        /// A brief description of the signal catalog.
        public let description: String?
        ///  The name of the signal catalog to create.
        public let name: String
        ///  A list of information about nodes, which are a general abstraction of signals. For more information, see the  API data type.
        public let nodes: [Node]?
        /// Metadata that can be used to manage the signal catalog.
        public let tags: [Tag]?

        public init(description: String? = nil, name: String, nodes: [Node]? = nil, tags: [Tag]? = nil) {
            self.description = description
            self.name = name
            self.nodes = nodes
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.nodes?.forEach {
                try $0.validate(name: "\(name).nodes[]")
            }
            try self.validate(self.nodes, name: "nodes", parent: name, max: 500)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case nodes
            case tags
        }
    }

    public struct CreateSignalCatalogResponse: AWSDecodableShape {
        ///  The ARN of the created signal catalog.
        public let arn: String
        ///  The name of the created signal catalog.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct CreateVehicleError: AWSDecodableShape {
        /// An HTTP error code.
        public let code: String?
        /// A description of the HTTP error.
        public let message: String?
        /// The ID of the vehicle with the error.
        public let vehicleName: String?

        public init(code: String? = nil, message: String? = nil, vehicleName: String? = nil) {
            self.code = code
            self.message = message
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case code
            case message
            case vehicleName
        }
    }

    public struct CreateVehicleRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "vehicleName", location: .uri("vehicleName"))
        ]

        ///  An option to create a new Amazon Web Services IoT thing when creating a vehicle, or to validate an existing Amazon Web Services IoT thing as a vehicle.  Default:
        public let associationBehavior: VehicleAssociationBehavior?
        /// Static information about a vehicle in a key-value pair. For example: "engineType" : "1.3 L R2"
        public let attributes: [String: String]?
        ///  The ARN of a decoder manifest.
        public let decoderManifestArn: String
        ///  The Amazon Resource Name ARN of a vehicle model.
        public let modelManifestArn: String
        /// Metadata that can be used to manage the vehicle.
        public let tags: [Tag]?
        ///  The unique ID of the vehicle to create.
        public let vehicleName: String

        public init(associationBehavior: VehicleAssociationBehavior? = nil, attributes: [String: String]? = nil, decoderManifestArn: String, modelManifestArn: String, tags: [Tag]? = nil, vehicleName: String) {
            self.associationBehavior = associationBehavior
            self.attributes = attributes
            self.decoderManifestArn = decoderManifestArn
            self.modelManifestArn = modelManifestArn
            self.tags = tags
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.attributes?.forEach {
                try validate($0.key, name: "attributes.key", parent: name, max: 150)
                try validate($0.key, name: "attributes.key", parent: name, min: 1)
                try validate($0.key, name: "attributes.key", parent: name, pattern: "^[a-zA-Z0-9_.-]+$")
            }
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case associationBehavior
            case attributes
            case decoderManifestArn
            case modelManifestArn
            case tags
        }
    }

    public struct CreateVehicleRequestItem: AWSEncodableShape {
        /// An option to create a new Amazon Web Services IoT thing when creating a vehicle, or to validate an existing thing as a vehicle.
        public let associationBehavior: VehicleAssociationBehavior?
        /// Static information about a vehicle in a key-value pair. For example: "engine Type" : "v6"
        public let attributes: [String: String]?
        /// The Amazon Resource Name (ARN) of a decoder manifest associated with the vehicle to create.
        public let decoderManifestArn: String
        /// The ARN of the vehicle model (model manifest) to create the vehicle from.
        public let modelManifestArn: String
        /// Metadata which can be used to manage the vehicle.
        public let tags: [Tag]?
        /// The unique ID of the vehicle to create.
        public let vehicleName: String

        public init(associationBehavior: VehicleAssociationBehavior? = nil, attributes: [String: String]? = nil, decoderManifestArn: String, modelManifestArn: String, tags: [Tag]? = nil, vehicleName: String) {
            self.associationBehavior = associationBehavior
            self.attributes = attributes
            self.decoderManifestArn = decoderManifestArn
            self.modelManifestArn = modelManifestArn
            self.tags = tags
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.attributes?.forEach {
                try validate($0.key, name: "attributes.key", parent: name, max: 150)
                try validate($0.key, name: "attributes.key", parent: name, min: 1)
                try validate($0.key, name: "attributes.key", parent: name, pattern: "^[a-zA-Z0-9_.-]+$")
            }
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case associationBehavior
            case attributes
            case decoderManifestArn
            case modelManifestArn
            case tags
            case vehicleName
        }
    }

    public struct CreateVehicleResponse: AWSDecodableShape {
        ///  The ARN of the created vehicle.
        public let arn: String?
        ///  The ARN of a created or validated Amazon Web Services IoT thing.
        public let thingArn: String?
        /// The unique ID of the created vehicle.
        public let vehicleName: String?

        public init(arn: String? = nil, thingArn: String? = nil, vehicleName: String? = nil) {
            self.arn = arn
            self.thingArn = thingArn
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case thingArn
            case vehicleName
        }
    }

    public struct CreateVehicleResponseItem: AWSDecodableShape {
        /// The ARN of the created vehicle.
        public let arn: String?
        /// The ARN of a created or validated Amazon Web Services IoT thing.
        public let thingArn: String?
        /// The unique ID of the vehicle to create.
        public let vehicleName: String?

        public init(arn: String? = nil, thingArn: String? = nil, vehicleName: String? = nil) {
            self.arn = arn
            self.thingArn = thingArn
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case thingArn
            case vehicleName
        }
    }

    public struct DecoderManifestSummary: AWSDecodableShape {
        /// The ARN of a vehicle model (model manifest) associated with the decoder manifest.
        public let arn: String?
        /// The time the decoder manifest was created in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        /// A brief description of the decoder manifest.
        public let description: String?
        /// The time the decoder manifest was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date
        /// The ARN of a vehicle model (model manifest) associated with the decoder manifest.
        public let modelManifestArn: String?
        /// The name of the decoder manifest.
        public let name: String?
        /// The state of the decoder manifest. If the status is ACTIVE, the decoder manifest can't be edited. If the status is marked DRAFT, you can edit the decoder manifest.
        public let status: ManifestStatus?

        public init(arn: String? = nil, creationTime: Date, description: String? = nil, lastModificationTime: Date, modelManifestArn: String? = nil, name: String? = nil, status: ManifestStatus? = nil) {
            self.arn = arn
            self.creationTime = creationTime
            self.description = description
            self.lastModificationTime = lastModificationTime
            self.modelManifestArn = modelManifestArn
            self.name = name
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case description
            case lastModificationTime
            case modelManifestArn
            case name
            case status
        }
    }

    public struct DeleteCampaignRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the campaign to delete.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteCampaignResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the deleted campaign.  The ARN isn’t returned if a campaign doesn’t exist.
        public let arn: String?
        /// The name of the deleted campaign.
        public let name: String?

        public init(arn: String? = nil, name: String? = nil) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct DeleteDecoderManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the decoder manifest to delete.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteDecoderManifestResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the deleted decoder manifest.
        public let arn: String
        /// The name of the deleted decoder manifest.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct DeleteFleetRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "fleetId", location: .uri("fleetId"))
        ]

        ///  The ID of the fleet to delete.
        public let fleetId: String

        public init(fleetId: String) {
            self.fleetId = fleetId
        }

        public func validate(name: String) throws {
            try self.validate(self.fleetId, name: "fleetId", parent: name, max: 100)
            try self.validate(self.fleetId, name: "fleetId", parent: name, min: 1)
            try self.validate(self.fleetId, name: "fleetId", parent: name, pattern: "^[a-zA-Z0-9:_-]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteFleetResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the deleted fleet.
        public let arn: String?
        /// The ID of the deleted fleet.
        public let id: String?

        public init(arn: String? = nil, id: String? = nil) {
            self.arn = arn
            self.id = id
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case id
        }
    }

    public struct DeleteModelManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the model manifest to delete.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteModelManifestResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the deleted model manifest.
        public let arn: String
        /// The name of the deleted model manifest.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct DeleteSignalCatalogRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the signal catalog to delete.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteSignalCatalogResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the deleted signal catalog.
        public let arn: String
        /// The name of the deleted signal catalog.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct DeleteVehicleRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "vehicleName", location: .uri("vehicleName"))
        ]

        /// The ID of the vehicle to delete.
        public let vehicleName: String

        public init(vehicleName: String) {
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct DeleteVehicleResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the deleted vehicle.
        public let arn: String
        /// The ID of the deleted vehicle.
        public let vehicleName: String

        public init(arn: String, vehicleName: String) {
            self.arn = arn
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case vehicleName
        }
    }

    public struct DisassociateVehicleFleetRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "vehicleName", location: .uri("vehicleName"))
        ]

        ///  The unique ID of a fleet.
        public let fleetId: String
        ///  The unique ID of the vehicle to disassociate from the fleet.
        public let vehicleName: String

        public init(fleetId: String, vehicleName: String) {
            self.fleetId = fleetId
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.validate(self.fleetId, name: "fleetId", parent: name, max: 100)
            try self.validate(self.fleetId, name: "fleetId", parent: name, min: 1)
            try self.validate(self.fleetId, name: "fleetId", parent: name, pattern: "^[a-zA-Z0-9:_-]+$")
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case fleetId
        }
    }

    public struct DisassociateVehicleFleetResponse: AWSDecodableShape {
        public init() {}
    }

    public struct FleetSummary: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the fleet.
        public let arn: String
        /// The time the fleet was created, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        /// A brief description of the fleet.
        public let description: String?
        /// The unique ID of the fleet.
        public let id: String
        /// The time the fleet was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date?
        /// The ARN of the signal catalog associated with the fleet.
        public let signalCatalogArn: String

        public init(arn: String, creationTime: Date, description: String? = nil, id: String, lastModificationTime: Date? = nil, signalCatalogArn: String) {
            self.arn = arn
            self.creationTime = creationTime
            self.description = description
            self.id = id
            self.lastModificationTime = lastModificationTime
            self.signalCatalogArn = signalCatalogArn
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case description
            case id
            case lastModificationTime
            case signalCatalogArn
        }
    }

    public struct GetCampaignRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the campaign to retrieve information about.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetCampaignResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the campaign.
        public let arn: String?
        ///  Information about the data collection scheme associated with the campaign.
        public let collectionScheme: CollectionScheme?
        ///  Whether to compress signals before transmitting data to Amazon Web Services IoT FleetWise. If OFF is specified, the signals aren't compressed. If it's not specified, SNAPPY is used.
        public let compression: Compression?
        ///  The time the campaign was created in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date?
        ///  A list of vehicle attributes associated with the campaign.
        public let dataExtraDimensions: [String]?
        /// The description of the campaign.
        public let description: String?
        ///  Option for a vehicle to send diagnostic trouble codes to Amazon Web Services IoT FleetWise.
        public let diagnosticsMode: DiagnosticsMode?
        ///  The time the campaign expires, in seconds since epoch (January 1, 1970 at midnight UTC time). Vehicle data won't be collected after the campaign expires.
        public let expiryTime: Date?
        /// The last time the campaign was modified.
        public let lastModificationTime: Date?
        /// The name of the campaign.
        public let name: String?
        ///  How long (in seconds) to collect raw data after a triggering event initiates the collection.
        public let postTriggerCollectionDuration: Int64?
        ///  A number indicating the priority of one campaign over another campaign for a certain vehicle or fleet. A campaign with the lowest value is deployed to vehicles before any other campaigns.
        public let priority: Int?
        ///  The ARN of a signal catalog.
        public let signalCatalogArn: String?
        ///  Information about a list of signals to collect data on.
        public let signalsToCollect: [SignalInformation]?
        ///  Whether to store collected data after a vehicle lost a connection with the cloud. After a connection is re-established, the data is automatically forwarded to Amazon Web Services IoT FleetWise.
        public let spoolingMode: SpoolingMode?
        ///  The time, in milliseconds, to deliver a campaign after it was approved.
        public let startTime: Date?
        /// The state of the campaign. The status can be one of: CREATING, WAITING_FOR_APPROVAL, RUNNING, and SUSPENDED.
        public let status: CampaignStatus?
        ///  The ARN of the vehicle or the fleet targeted by the campaign.
        public let targetArn: String?

        public init(arn: String? = nil, collectionScheme: CollectionScheme? = nil, compression: Compression? = nil, creationTime: Date? = nil, dataExtraDimensions: [String]? = nil, description: String? = nil, diagnosticsMode: DiagnosticsMode? = nil, expiryTime: Date? = nil, lastModificationTime: Date? = nil, name: String? = nil, postTriggerCollectionDuration: Int64? = nil, priority: Int? = nil, signalCatalogArn: String? = nil, signalsToCollect: [SignalInformation]? = nil, spoolingMode: SpoolingMode? = nil, startTime: Date? = nil, status: CampaignStatus? = nil, targetArn: String? = nil) {
            self.arn = arn
            self.collectionScheme = collectionScheme
            self.compression = compression
            self.creationTime = creationTime
            self.dataExtraDimensions = dataExtraDimensions
            self.description = description
            self.diagnosticsMode = diagnosticsMode
            self.expiryTime = expiryTime
            self.lastModificationTime = lastModificationTime
            self.name = name
            self.postTriggerCollectionDuration = postTriggerCollectionDuration
            self.priority = priority
            self.signalCatalogArn = signalCatalogArn
            self.signalsToCollect = signalsToCollect
            self.spoolingMode = spoolingMode
            self.startTime = startTime
            self.status = status
            self.targetArn = targetArn
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case collectionScheme
            case compression
            case creationTime
            case dataExtraDimensions
            case description
            case diagnosticsMode
            case expiryTime
            case lastModificationTime
            case name
            case postTriggerCollectionDuration
            case priority
            case signalCatalogArn
            case signalsToCollect
            case spoolingMode
            case startTime
            case status
            case targetArn
        }
    }

    public struct GetDecoderManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the decoder manifest to retrieve information about.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetDecoderManifestResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the decoder manifest.
        public let arn: String
        ///  The time the decoder manifest was created in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        ///  A brief description of the decoder manifest.
        public let description: String?
        ///  The time the decoder manifest was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date
        ///  The ARN of a vehicle model (model manifest) associated with the decoder manifest.
        public let modelManifestArn: String?
        ///  The name of the decoder manifest.
        public let name: String
        ///  The state of the decoder manifest. If the status is ACTIVE, the decoder manifest can't be edited. If the status is marked DRAFT, you can edit the decoder manifest.
        public let status: ManifestStatus?

        public init(arn: String, creationTime: Date, description: String? = nil, lastModificationTime: Date, modelManifestArn: String? = nil, name: String, status: ManifestStatus? = nil) {
            self.arn = arn
            self.creationTime = creationTime
            self.description = description
            self.lastModificationTime = lastModificationTime
            self.modelManifestArn = modelManifestArn
            self.name = name
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case description
            case lastModificationTime
            case modelManifestArn
            case name
            case status
        }
    }

    public struct GetFleetRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "fleetId", location: .uri("fleetId"))
        ]

        ///  The ID of the fleet to retrieve information about.
        public let fleetId: String

        public init(fleetId: String) {
            self.fleetId = fleetId
        }

        public func validate(name: String) throws {
            try self.validate(self.fleetId, name: "fleetId", parent: name, max: 100)
            try self.validate(self.fleetId, name: "fleetId", parent: name, min: 1)
            try self.validate(self.fleetId, name: "fleetId", parent: name, pattern: "^[a-zA-Z0-9:_-]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetFleetResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the fleet.
        public let arn: String
        ///  The time the fleet was created in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        ///  A brief description of the fleet.
        public let description: String?
        ///  The ID of the fleet.
        public let id: String
        ///  The time the fleet was last updated, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date
        ///  The ARN of a signal catalog associated with the fleet.
        public let signalCatalogArn: String

        public init(arn: String, creationTime: Date, description: String? = nil, id: String, lastModificationTime: Date, signalCatalogArn: String) {
            self.arn = arn
            self.creationTime = creationTime
            self.description = description
            self.id = id
            self.lastModificationTime = lastModificationTime
            self.signalCatalogArn = signalCatalogArn
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case description
            case id
            case lastModificationTime
            case signalCatalogArn
        }
    }

    public struct GetLoggingOptionsRequest: AWSEncodableShape {
        public init() {}
    }

    public struct GetLoggingOptionsResponse: AWSDecodableShape {
        /// Returns information about log delivery to Amazon CloudWatch Logs.
        public let cloudWatchLogDelivery: CloudWatchLogDeliveryOptions

        public init(cloudWatchLogDelivery: CloudWatchLogDeliveryOptions) {
            self.cloudWatchLogDelivery = cloudWatchLogDelivery
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchLogDelivery
        }
    }

    public struct GetModelManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the vehicle model to retrieve information about.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetModelManifestResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the vehicle model.
        public let arn: String
        /// The time the vehicle model was created, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        ///  A brief description of the vehicle model.
        public let description: String?
        /// The last time the vehicle model was modified.
        public let lastModificationTime: Date
        ///  The name of the vehicle model.
        public let name: String
        ///  The ARN of the signal catalog associated with the vehicle model.
        public let signalCatalogArn: String?
        ///  The state of the vehicle model. If the status is ACTIVE, the vehicle model can't be edited. You can edit the vehicle model if the status is marked DRAFT.
        public let status: ManifestStatus?

        public init(arn: String, creationTime: Date, description: String? = nil, lastModificationTime: Date, name: String, signalCatalogArn: String? = nil, status: ManifestStatus? = nil) {
            self.arn = arn
            self.creationTime = creationTime
            self.description = description
            self.lastModificationTime = lastModificationTime
            self.name = name
            self.signalCatalogArn = signalCatalogArn
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case description
            case lastModificationTime
            case name
            case signalCatalogArn
            case status
        }
    }

    public struct GetRegisterAccountStatusRequest: AWSEncodableShape {
        public init() {}
    }

    public struct GetRegisterAccountStatusResponse: AWSDecodableShape {
        ///  The status of registering your account and resources. The status can be one of:    REGISTRATION_SUCCESS - The Amazon Web Services resource is successfully registered.    REGISTRATION_PENDING - Amazon Web Services IoT FleetWise is processing the registration request. This process takes approximately five minutes to complete.    REGISTRATION_FAILURE - Amazon Web Services IoT FleetWise can't register the AWS resource. Try again later.
        public let accountStatus: RegistrationStatus
        ///  The time the account was registered, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        ///  The unique ID of the Amazon Web Services account, provided at account creation.
        public let customerAccountId: String
        ///  Information about the registered IAM resources or errors, if any.
        public let iamRegistrationResponse: IamRegistrationResponse
        ///  The time this registration was last updated, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date
        ///  Information about the registered Amazon Timestream resources or errors, if any.
        public let timestreamRegistrationResponse: TimestreamRegistrationResponse

        public init(accountStatus: RegistrationStatus, creationTime: Date, customerAccountId: String, iamRegistrationResponse: IamRegistrationResponse, lastModificationTime: Date, timestreamRegistrationResponse: TimestreamRegistrationResponse) {
            self.accountStatus = accountStatus
            self.creationTime = creationTime
            self.customerAccountId = customerAccountId
            self.iamRegistrationResponse = iamRegistrationResponse
            self.lastModificationTime = lastModificationTime
            self.timestreamRegistrationResponse = timestreamRegistrationResponse
        }

        private enum CodingKeys: String, CodingKey {
            case accountStatus
            case creationTime
            case customerAccountId
            case iamRegistrationResponse
            case lastModificationTime
            case timestreamRegistrationResponse
        }
    }

    public struct GetSignalCatalogRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the signal catalog to retrieve information about.
        public let name: String

        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetSignalCatalogResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the signal catalog.
        public let arn: String
        ///  The time the signal catalog was created in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        ///  A brief description of the signal catalog.
        public let description: String?
        /// The last time the signal catalog was modified.
        public let lastModificationTime: Date
        ///  The name of the signal catalog.
        public let name: String
        ///  The total number of network nodes specified in a signal catalog.
        public let nodeCounts: NodeCounts?

        public init(arn: String, creationTime: Date, description: String? = nil, lastModificationTime: Date, name: String, nodeCounts: NodeCounts? = nil) {
            self.arn = arn
            self.creationTime = creationTime
            self.description = description
            self.lastModificationTime = lastModificationTime
            self.name = name
            self.nodeCounts = nodeCounts
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case description
            case lastModificationTime
            case name
            case nodeCounts
        }
    }

    public struct GetVehicleRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "vehicleName", location: .uri("vehicleName"))
        ]

        ///  The ID of the vehicle to retrieve information about.
        public let vehicleName: String

        public init(vehicleName: String) {
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetVehicleResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the vehicle to retrieve information about.
        public let arn: String?
        /// Static information about a vehicle in a key-value pair. For example:  "engineType" : "1.3 L R2"
        public let attributes: [String: String]?
        ///  The time the vehicle was created in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date?
        ///  The ARN of a decoder manifest associated with the vehicle.
        public let decoderManifestArn: String?
        ///  The time the vehicle was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date?
        ///  The ARN of a vehicle model (model manifest) associated with the vehicle.
        public let modelManifestArn: String?
        /// The ID of the vehicle.
        public let vehicleName: String?

        public init(arn: String? = nil, attributes: [String: String]? = nil, creationTime: Date? = nil, decoderManifestArn: String? = nil, lastModificationTime: Date? = nil, modelManifestArn: String? = nil, vehicleName: String? = nil) {
            self.arn = arn
            self.attributes = attributes
            self.creationTime = creationTime
            self.decoderManifestArn = decoderManifestArn
            self.lastModificationTime = lastModificationTime
            self.modelManifestArn = modelManifestArn
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case attributes
            case creationTime
            case decoderManifestArn
            case lastModificationTime
            case modelManifestArn
            case vehicleName
        }
    }

    public struct GetVehicleStatusRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken")),
            AWSMemberEncoding(label: "vehicleName", location: .uri("vehicleName"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?
        ///  The ID of the vehicle to retrieve information about.
        public let vehicleName: String

        public init(maxResults: Int? = nil, nextToken: String? = nil, vehicleName: String) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct GetVehicleStatusResponse: AWSDecodableShape {
        ///  Lists information about the state of the vehicle with deployed campaigns.
        public let campaigns: [VehicleStatus]?
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?

        public init(campaigns: [VehicleStatus]? = nil, nextToken: String? = nil) {
            self.campaigns = campaigns
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case campaigns
            case nextToken
        }
    }

    public struct IamRegistrationResponse: AWSDecodableShape {
        /// A message associated with a registration error.
        public let errorMessage: String?
        /// The status of registering your IAM resource. The status can be one of REGISTRATION_SUCCESS, REGISTRATION_PENDING, REGISTRATION_FAILURE.
        public let registrationStatus: RegistrationStatus
        /// The Amazon Resource Name (ARN) of the IAM role to register.
        public let roleArn: String

        public init(errorMessage: String? = nil, registrationStatus: RegistrationStatus, roleArn: String) {
            self.errorMessage = errorMessage
            self.registrationStatus = registrationStatus
            self.roleArn = roleArn
        }

        private enum CodingKeys: String, CodingKey {
            case errorMessage
            case registrationStatus
            case roleArn
        }
    }

    public struct IamResources: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the IAM resource that allows Amazon Web Services IoT FleetWise to send data to Amazon Timestream. For example, arn:aws:iam::123456789012:role/SERVICE-ROLE-ARN.
        public let roleArn: String

        public init(roleArn: String) {
            self.roleArn = roleArn
        }

        public func validate(name: String) throws {
            try self.validate(self.roleArn, name: "roleArn", parent: name, max: 2048)
            try self.validate(self.roleArn, name: "roleArn", parent: name, min: 20)
            try self.validate(self.roleArn, name: "roleArn", parent: name, pattern: "^arn:(aws[a-zA-Z0-9-]*):iam::(\\d{12})?:(role((\\u002F)|(\\u002F[\\u0021-\\u007F]+\\u002F))[\\w+=,.@-]+)$")
        }

        private enum CodingKeys: String, CodingKey {
            case roleArn
        }
    }

    public struct ImportDecoderManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  The name of the decoder manifest to import.
        public let name: String
        ///  The file to load into an Amazon Web Services account.
        public let networkFileDefinitions: [NetworkFileDefinition]

        public init(name: String, networkFileDefinitions: [NetworkFileDefinition]) {
            self.name = name
            self.networkFileDefinitions = networkFileDefinitions
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.networkFileDefinitions.forEach {
                try $0.validate(name: "\(name).networkFileDefinitions[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case networkFileDefinitions
        }
    }

    public struct ImportDecoderManifestResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the decoder manifest that was imported.
        public let arn: String
        ///  The name of the imported decoder manifest.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct ImportSignalCatalogRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  A brief description of the signal catalog.
        public let description: String?
        /// The name of the signal catalog to import.
        public let name: String
        /// Metadata that can be used to manage the signal catalog.
        public let tags: [Tag]?
        /// The contents of the Vehicle Signal Specification (VSS) configuration. VSS is a precise language used to describe and model signals in vehicle networks.
        public let vss: FormattedVss?

        public init(description: String? = nil, name: String, tags: [Tag]? = nil, vss: FormattedVss? = nil) {
            self.description = description
            self.name = name
            self.tags = tags
            self.vss = vss
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case tags
            case vss
        }
    }

    public struct ImportSignalCatalogResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the imported signal catalog.
        public let arn: String
        ///  The name of the imported signal catalog.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct ListCampaignsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken")),
            AWSMemberEncoding(label: "status", location: .querystring("status"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?
        /// Optional parameter to filter the results by the status of each created campaign in your account. The status can be one of: CREATING, WAITING_FOR_APPROVAL, RUNNING, or SUSPENDED.
        public let status: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil, status: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.status = status
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListCampaignsResponse: AWSDecodableShape {
        ///  A summary of information about each campaign.
        public let campaignSummaries: [CampaignSummary]?
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?

        public init(campaignSummaries: [CampaignSummary]? = nil, nextToken: String? = nil) {
            self.campaignSummaries = campaignSummaries
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case campaignSummaries
            case nextToken
        }
    }

    public struct ListDecoderManifestNetworkInterfacesRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "name", location: .uri("name")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        ///  The name of the decoder manifest to list information about.
        public let name: String
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(maxResults: Int? = nil, name: String, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListDecoderManifestNetworkInterfacesResponse: AWSDecodableShape {
        ///  A list of information about network interfaces.
        public let networkInterfaces: [NetworkInterface]?
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?

        public init(networkInterfaces: [NetworkInterface]? = nil, nextToken: String? = nil) {
            self.networkInterfaces = networkInterfaces
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case networkInterfaces
            case nextToken
        }
    }

    public struct ListDecoderManifestSignalsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "name", location: .uri("name")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        ///  The name of the decoder manifest to list information about.
        public let name: String
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(maxResults: Int? = nil, name: String, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListDecoderManifestSignalsResponse: AWSDecodableShape {
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?
        ///  Information about a list of signals to decode.
        public let signalDecoders: [SignalDecoder]?

        public init(nextToken: String? = nil, signalDecoders: [SignalDecoder]? = nil) {
            self.nextToken = nextToken
            self.signalDecoders = signalDecoders
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken
            case signalDecoders
        }
    }

    public struct ListDecoderManifestsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "modelManifestArn", location: .querystring("modelManifestArn")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        ///  The Amazon Resource Name (ARN) of a vehicle model (model manifest) associated with the decoder manifest.
        public let modelManifestArn: String?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(maxResults: Int? = nil, modelManifestArn: String? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.modelManifestArn = modelManifestArn
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListDecoderManifestsResponse: AWSDecodableShape {
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?
        ///  A list of information about each decoder manifest.
        public let summaries: [DecoderManifestSummary]?

        public init(nextToken: String? = nil, summaries: [DecoderManifestSummary]? = nil) {
            self.nextToken = nextToken
            self.summaries = summaries
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken
            case summaries
        }
    }

    public struct ListFleetsForVehicleRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken")),
            AWSMemberEncoding(label: "vehicleName", location: .uri("vehicleName"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?
        ///  The ID of the vehicle to retrieve information about.
        public let vehicleName: String

        public init(maxResults: Int? = nil, nextToken: String? = nil, vehicleName: String) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListFleetsForVehicleResponse: AWSDecodableShape {
        ///  A list of fleet IDs that the vehicle is associated with.
        public let fleets: [String]?
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?

        public init(fleets: [String]? = nil, nextToken: String? = nil) {
            self.fleets = fleets
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case fleets
            case nextToken
        }
    }

    public struct ListFleetsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListFleetsResponse: AWSDecodableShape {
        ///  A list of information for each fleet.
        public let fleetSummaries: [FleetSummary]?
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?

        public init(fleetSummaries: [FleetSummary]? = nil, nextToken: String? = nil) {
            self.fleetSummaries = fleetSummaries
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case fleetSummaries
            case nextToken
        }
    }

    public struct ListModelManifestNodesRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "name", location: .uri("name")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        ///  The name of the vehicle model to list information about.
        public let name: String
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(maxResults: Int? = nil, name: String, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListModelManifestNodesResponse: AWSDecodableShape {
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?
        ///  A list of information about nodes.
        public let nodes: [Node]?

        public init(nextToken: String? = nil, nodes: [Node]? = nil) {
            self.nextToken = nextToken
            self.nodes = nodes
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken
            case nodes
        }
    }

    public struct ListModelManifestsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken")),
            AWSMemberEncoding(label: "signalCatalogArn", location: .querystring("signalCatalogArn"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?
        ///  The ARN of a signal catalog. If you specify a signal catalog, only the vehicle models associated with it are returned.
        public let signalCatalogArn: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil, signalCatalogArn: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.signalCatalogArn = signalCatalogArn
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListModelManifestsResponse: AWSDecodableShape {
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?
        ///  A list of information about vehicle models.
        public let summaries: [ModelManifestSummary]?

        public init(nextToken: String? = nil, summaries: [ModelManifestSummary]? = nil) {
            self.nextToken = nextToken
            self.summaries = summaries
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken
            case summaries
        }
    }

    public struct ListSignalCatalogNodesRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "name", location: .uri("name")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        ///  The name of the signal catalog to list information about.
        public let name: String
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(maxResults: Int? = nil, name: String, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.name = name
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListSignalCatalogNodesResponse: AWSDecodableShape {
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?
        ///  A list of information about nodes.
        public let nodes: [Node]?

        public init(nextToken: String? = nil, nodes: [Node]? = nil) {
            self.nextToken = nextToken
            self.nodes = nodes
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken
            case nodes
        }
    }

    public struct ListSignalCatalogsRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListSignalCatalogsResponse: AWSDecodableShape {
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?
        ///  A list of information about each signal catalog.
        public let summaries: [SignalCatalogSummary]?

        public init(nextToken: String? = nil, summaries: [SignalCatalogSummary]? = nil) {
            self.nextToken = nextToken
            self.summaries = summaries
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken
            case summaries
        }
    }

    public struct ListTagsForResourceRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceARN", location: .querystring("resourceArn"))
        ]

        /// The ARN of the resource.
        public let resourceARN: String

        public init(resourceARN: String) {
            self.resourceARN = resourceARN
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceARN, name: "resourceARN", parent: name, max: 1011)
            try self.validate(self.resourceARN, name: "resourceARN", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListTagsForResourceResponse: AWSDecodableShape {
        /// The list of tags assigned to the resource.
        public let tags: [Tag]?

        public init(tags: [Tag]? = nil) {
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct ListVehiclesInFleetRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "fleetId", location: .uri("fleetId")),
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The ID of a fleet.
        public let fleetId: String
        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(fleetId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.fleetId = fleetId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.fleetId, name: "fleetId", parent: name, max: 100)
            try self.validate(self.fleetId, name: "fleetId", parent: name, min: 1)
            try self.validate(self.fleetId, name: "fleetId", parent: name, pattern: "^[a-zA-Z0-9:_-]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListVehiclesInFleetResponse: AWSDecodableShape {
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?
        ///  A list of vehicles associated with the fleet.
        public let vehicles: [String]?

        public init(nextToken: String? = nil, vehicles: [String]? = nil) {
            self.nextToken = nextToken
            self.vehicles = vehicles
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken
            case vehicles
        }
    }

    public struct ListVehiclesRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "maxResults", location: .querystring("maxResults")),
            AWSMemberEncoding(label: "modelManifestArn", location: .querystring("modelManifestArn")),
            AWSMemberEncoding(label: "nextToken", location: .querystring("nextToken"))
        ]

        ///  The maximum number of items to return, between 1 and 100, inclusive.
        public let maxResults: Int?
        ///  The Amazon Resource Name (ARN) of a vehicle model (model manifest). You can use this optional parameter to list only the vehicles created from a certain vehicle model.
        public let modelManifestArn: String?
        /// A pagination token for the next set of results. If the results of a search are large, only a portion of the results are returned, and a nextToken pagination token is returned in the response. To retrieve the next set of results, reissue the search request and include the returned token. When all results have been returned, the response does not contain a pagination token value.
        public let nextToken: String?

        public init(maxResults: Int? = nil, modelManifestArn: String? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.modelManifestArn = modelManifestArn
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 4096)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct ListVehiclesResponse: AWSDecodableShape {
        ///  The token to retrieve the next set of results, or null if there are no more results.
        public let nextToken: String?
        ///  A list of vehicles and information about them.
        public let vehicleSummaries: [VehicleSummary]?

        public init(nextToken: String? = nil, vehicleSummaries: [VehicleSummary]? = nil) {
            self.nextToken = nextToken
            self.vehicleSummaries = vehicleSummaries
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken
            case vehicleSummaries
        }
    }

    public struct ModelManifestSummary: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the vehicle model.
        public let arn: String?
        /// The time the vehicle model was created, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        /// A brief description of the vehicle model.
        public let description: String?
        /// The time the vehicle model was last updated, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date
        /// The name of the vehicle model.
        public let name: String?
        /// The ARN of the signal catalog associated with the vehicle model.
        public let signalCatalogArn: String?
        /// The state of the vehicle model. If the status is ACTIVE, the vehicle model can't be edited. If the status is DRAFT, you can edit the vehicle model.
        public let status: ManifestStatus?

        public init(arn: String? = nil, creationTime: Date, description: String? = nil, lastModificationTime: Date, name: String? = nil, signalCatalogArn: String? = nil, status: ManifestStatus? = nil) {
            self.arn = arn
            self.creationTime = creationTime
            self.description = description
            self.lastModificationTime = lastModificationTime
            self.name = name
            self.signalCatalogArn = signalCatalogArn
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case description
            case lastModificationTime
            case name
            case signalCatalogArn
            case status
        }
    }

    public struct NetworkInterface: AWSEncodableShape & AWSDecodableShape {
        /// Information about a network interface specified by the Controller Area Network (CAN) protocol.
        public let canInterface: CanInterface?
        /// The ID of the network interface.
        public let interfaceId: String
        /// Information about a network interface specified by the On-board diagnostic (OBD) II protocol.
        public let obdInterface: ObdInterface?
        /// The network protocol for the vehicle. For example, CAN_SIGNAL specifies a protocol that defines how data is communicated between electronic control units (ECUs). OBD_SIGNAL specifies a protocol that defines how self-diagnostic data is communicated between ECUs.
        public let type: NetworkInterfaceType

        public init(canInterface: CanInterface? = nil, interfaceId: String, obdInterface: ObdInterface? = nil, type: NetworkInterfaceType) {
            self.canInterface = canInterface
            self.interfaceId = interfaceId
            self.obdInterface = obdInterface
            self.type = type
        }

        public func validate(name: String) throws {
            try self.canInterface?.validate(name: "\(name).canInterface")
            try self.validate(self.interfaceId, name: "interfaceId", parent: name, max: 50)
            try self.validate(self.interfaceId, name: "interfaceId", parent: name, min: 1)
            try self.obdInterface?.validate(name: "\(name).obdInterface")
        }

        private enum CodingKeys: String, CodingKey {
            case canInterface
            case interfaceId
            case obdInterface
            case type
        }
    }

    public struct NodeCounts: AWSDecodableShape {
        /// The total number of nodes in a vehicle network that represent actuators.
        public let totalActuators: Int?
        /// The total number of nodes in a vehicle network that represent attributes.
        public let totalAttributes: Int?
        /// The total number of nodes in a vehicle network that represent branches.
        public let totalBranches: Int?
        /// The total number of nodes in a vehicle network.
        public let totalNodes: Int?
        /// The total number of nodes in a vehicle network that represent sensors.
        public let totalSensors: Int?

        public init(totalActuators: Int? = nil, totalAttributes: Int? = nil, totalBranches: Int? = nil, totalNodes: Int? = nil, totalSensors: Int? = nil) {
            self.totalActuators = totalActuators
            self.totalAttributes = totalAttributes
            self.totalBranches = totalBranches
            self.totalNodes = totalNodes
            self.totalSensors = totalSensors
        }

        private enum CodingKeys: String, CodingKey {
            case totalActuators
            case totalAttributes
            case totalBranches
            case totalNodes
            case totalSensors
        }
    }

    public struct ObdInterface: AWSEncodableShape & AWSDecodableShape {
        /// The maximum number message requests per diagnostic trouble code per second.
        public let dtcRequestIntervalSeconds: Int?
        /// Whether the vehicle has a transmission control module (TCM).
        public let hasTransmissionEcu: Bool?
        /// The name of the interface.
        public let name: String
        /// The standard OBD II PID.
        public let obdStandard: String?
        /// The maximum number message requests per second.
        public let pidRequestIntervalSeconds: Int?
        /// The ID of the message requesting vehicle data.
        public let requestMessageId: Int
        /// Whether to use extended IDs in the message.
        public let useExtendedIds: Bool?

        public init(dtcRequestIntervalSeconds: Int? = nil, hasTransmissionEcu: Bool? = nil, name: String, obdStandard: String? = nil, pidRequestIntervalSeconds: Int? = nil, requestMessageId: Int, useExtendedIds: Bool? = nil) {
            self.dtcRequestIntervalSeconds = dtcRequestIntervalSeconds
            self.hasTransmissionEcu = hasTransmissionEcu
            self.name = name
            self.obdStandard = obdStandard
            self.pidRequestIntervalSeconds = pidRequestIntervalSeconds
            self.requestMessageId = requestMessageId
            self.useExtendedIds = useExtendedIds
        }

        public func validate(name: String) throws {
            try self.validate(self.dtcRequestIntervalSeconds, name: "dtcRequestIntervalSeconds", parent: name, min: 0)
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.obdStandard, name: "obdStandard", parent: name, max: 50)
            try self.validate(self.obdStandard, name: "obdStandard", parent: name, min: 1)
            try self.validate(self.pidRequestIntervalSeconds, name: "pidRequestIntervalSeconds", parent: name, min: 0)
            try self.validate(self.requestMessageId, name: "requestMessageId", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case dtcRequestIntervalSeconds
            case hasTransmissionEcu
            case name
            case obdStandard
            case pidRequestIntervalSeconds
            case requestMessageId
            case useExtendedIds
        }
    }

    public struct ObdSignal: AWSEncodableShape & AWSDecodableShape {
        /// The number of bits to mask in a message.
        public let bitMaskLength: Int?
        /// The number of positions to shift bits in the message.
        public let bitRightShift: Int?
        /// The length of a message.
        public let byteLength: Int
        /// Indicates where data appears in the message.
        public let offset: Double
        /// The diagnostic code used to request data from a vehicle for this signal.
        public let pid: Int
        /// The length of the requested data.
        public let pidResponseLength: Int
        /// A multiplier used to decode the message.
        public let scaling: Double
        /// The mode of operation (diagnostic service) in a message.
        public let serviceMode: Int
        /// Indicates the beginning of the message.
        public let startByte: Int

        public init(bitMaskLength: Int? = nil, bitRightShift: Int? = nil, byteLength: Int, offset: Double, pid: Int, pidResponseLength: Int, scaling: Double, serviceMode: Int, startByte: Int) {
            self.bitMaskLength = bitMaskLength
            self.bitRightShift = bitRightShift
            self.byteLength = byteLength
            self.offset = offset
            self.pid = pid
            self.pidResponseLength = pidResponseLength
            self.scaling = scaling
            self.serviceMode = serviceMode
            self.startByte = startByte
        }

        public func validate(name: String) throws {
            try self.validate(self.bitMaskLength, name: "bitMaskLength", parent: name, max: 8)
            try self.validate(self.bitMaskLength, name: "bitMaskLength", parent: name, min: 1)
            try self.validate(self.bitRightShift, name: "bitRightShift", parent: name, min: 0)
            try self.validate(self.byteLength, name: "byteLength", parent: name, max: 8)
            try self.validate(self.byteLength, name: "byteLength", parent: name, min: 1)
            try self.validate(self.pid, name: "pid", parent: name, min: 0)
            try self.validate(self.pidResponseLength, name: "pidResponseLength", parent: name, min: 1)
            try self.validate(self.serviceMode, name: "serviceMode", parent: name, min: 0)
            try self.validate(self.startByte, name: "startByte", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case bitMaskLength
            case bitRightShift
            case byteLength
            case offset
            case pid
            case pidResponseLength
            case scaling
            case serviceMode
            case startByte
        }
    }

    public struct PutLoggingOptionsRequest: AWSEncodableShape {
        /// Creates or updates the log delivery option to Amazon CloudWatch Logs.
        public let cloudWatchLogDelivery: CloudWatchLogDeliveryOptions

        public init(cloudWatchLogDelivery: CloudWatchLogDeliveryOptions) {
            self.cloudWatchLogDelivery = cloudWatchLogDelivery
        }

        public func validate(name: String) throws {
            try self.cloudWatchLogDelivery.validate(name: "\(name).cloudWatchLogDelivery")
        }

        private enum CodingKeys: String, CodingKey {
            case cloudWatchLogDelivery
        }
    }

    public struct PutLoggingOptionsResponse: AWSDecodableShape {
        public init() {}
    }

    public struct RegisterAccountRequest: AWSEncodableShape {
        /// The IAM resource that allows Amazon Web Services IoT FleetWise to send data to Amazon Timestream.
        public let iamResources: IamResources?
        public let timestreamResources: TimestreamResources

        public init(timestreamResources: TimestreamResources) {
            self.iamResources = nil
            self.timestreamResources = timestreamResources
        }

        @available(*, deprecated, message: "Members iamResources have been deprecated")
        public init(iamResources: IamResources? = nil, timestreamResources: TimestreamResources) {
            self.iamResources = iamResources
            self.timestreamResources = timestreamResources
        }

        public func validate(name: String) throws {
            try self.iamResources?.validate(name: "\(name).iamResources")
            try self.timestreamResources.validate(name: "\(name).timestreamResources")
        }

        private enum CodingKeys: String, CodingKey {
            case iamResources
            case timestreamResources
        }
    }

    public struct RegisterAccountResponse: AWSDecodableShape {
        ///  The time the account was registered, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        ///  The registered IAM resource that allows Amazon Web Services IoT FleetWise to send data to Amazon Timestream.
        public let iamResources: IamResources
        ///  The time this registration was last updated, in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date
        ///  The status of registering your Amazon Web Services account, IAM role, and Timestream resources.
        public let registerAccountStatus: RegistrationStatus
        public let timestreamResources: TimestreamResources

        public init(creationTime: Date, iamResources: IamResources, lastModificationTime: Date, registerAccountStatus: RegistrationStatus, timestreamResources: TimestreamResources) {
            self.creationTime = creationTime
            self.iamResources = iamResources
            self.lastModificationTime = lastModificationTime
            self.registerAccountStatus = registerAccountStatus
            self.timestreamResources = timestreamResources
        }

        private enum CodingKeys: String, CodingKey {
            case creationTime
            case iamResources
            case lastModificationTime
            case registerAccountStatus
            case timestreamResources
        }
    }

    public struct Sensor: AWSEncodableShape & AWSDecodableShape {
        /// A list of possible values a sensor can take.
        public let allowedValues: [String]?
        /// The specified data type of the sensor.
        public let dataType: NodeDataType
        /// A brief description of a sensor.
        public let description: String?
        /// The fully qualified name of the sensor. For example, the fully qualified name of a sensor might be Vehicle.Body.Engine.Battery.
        public let fullyQualifiedName: String
        /// The specified possible maximum value of the sensor.
        public let max: Double?
        /// The specified possible minimum value of the sensor.
        public let min: Double?
        /// The scientific unit of measurement for data collected by the sensor.
        public let unit: String?

        public init(allowedValues: [String]? = nil, dataType: NodeDataType, description: String? = nil, fullyQualifiedName: String, max: Double? = nil, min: Double? = nil, unit: String? = nil) {
            self.allowedValues = allowedValues
            self.dataType = dataType
            self.description = description
            self.fullyQualifiedName = fullyQualifiedName
            self.max = max
            self.min = min
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case allowedValues
            case dataType
            case description
            case fullyQualifiedName
            case max
            case min
            case unit
        }
    }

    public struct SignalCatalogSummary: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the signal catalog.
        public let arn: String?
        /// The time the signal catalog was created in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date?
        /// The time the signal catalog was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date?
        /// The name of the signal catalog.
        public let name: String?

        public init(arn: String? = nil, creationTime: Date? = nil, lastModificationTime: Date? = nil, name: String? = nil) {
            self.arn = arn
            self.creationTime = creationTime
            self.lastModificationTime = lastModificationTime
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case lastModificationTime
            case name
        }
    }

    public struct SignalDecoder: AWSEncodableShape & AWSDecodableShape {
        /// Information about signal decoder using the Controller Area Network (CAN) protocol.
        public let canSignal: CanSignal?
        /// The fully qualified name of a signal decoder as defined in a vehicle model.
        public let fullyQualifiedName: String
        /// The ID of a network interface that specifies what network protocol a vehicle follows.
        public let interfaceId: String
        /// Information about signal decoder using the On-board diagnostic (OBD) II protocol.
        public let obdSignal: ObdSignal?
        /// The network protocol for the vehicle. For example, CAN_SIGNAL specifies a protocol that defines how data is communicated between electronic control units (ECUs). OBD_SIGNAL specifies a protocol that defines how self-diagnostic data is communicated between ECUs.
        public let type: SignalDecoderType

        public init(canSignal: CanSignal? = nil, fullyQualifiedName: String, interfaceId: String, obdSignal: ObdSignal? = nil, type: SignalDecoderType) {
            self.canSignal = canSignal
            self.fullyQualifiedName = fullyQualifiedName
            self.interfaceId = interfaceId
            self.obdSignal = obdSignal
            self.type = type
        }

        public func validate(name: String) throws {
            try self.canSignal?.validate(name: "\(name).canSignal")
            try self.validate(self.fullyQualifiedName, name: "fullyQualifiedName", parent: name, max: 150)
            try self.validate(self.fullyQualifiedName, name: "fullyQualifiedName", parent: name, min: 1)
            try self.validate(self.interfaceId, name: "interfaceId", parent: name, max: 50)
            try self.validate(self.interfaceId, name: "interfaceId", parent: name, min: 1)
            try self.obdSignal?.validate(name: "\(name).obdSignal")
        }

        private enum CodingKeys: String, CodingKey {
            case canSignal
            case fullyQualifiedName
            case interfaceId
            case obdSignal
            case type
        }
    }

    public struct SignalInformation: AWSEncodableShape & AWSDecodableShape {
        /// The maximum number of samples to collect.
        public let maxSampleCount: Int64?
        /// The minimum duration of time (in milliseconds) between two triggering events to collect data.  If a signal changes often, you might want to collect data at a slower rate.
        public let minimumSamplingIntervalMs: Int64?
        /// The name of the signal.
        public let name: String

        public init(maxSampleCount: Int64? = nil, minimumSamplingIntervalMs: Int64? = nil, name: String) {
            self.maxSampleCount = maxSampleCount
            self.minimumSamplingIntervalMs = minimumSamplingIntervalMs
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.maxSampleCount, name: "maxSampleCount", parent: name, max: 4_294_967_295)
            try self.validate(self.maxSampleCount, name: "maxSampleCount", parent: name, min: 1)
            try self.validate(self.minimumSamplingIntervalMs, name: "minimumSamplingIntervalMs", parent: name, max: 4_294_967_295)
            try self.validate(self.minimumSamplingIntervalMs, name: "minimumSamplingIntervalMs", parent: name, min: 0)
            try self.validate(self.name, name: "name", parent: name, max: 150)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[\\w|*|-]+(\\.[\\w|*|-]+)*$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxSampleCount
            case minimumSamplingIntervalMs
            case name
        }
    }

    public struct Tag: AWSEncodableShape & AWSDecodableShape {
        /// The tag's key.
        public let key: String
        /// The tag's value.
        public let value: String

        public init(key: String, value: String) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.value, name: "value", parent: name, max: 256)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TagResourceRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceARN", location: .querystring("resourceArn"))
        ]

        /// The ARN of the resource.
        public let resourceARN: String
        /// The new or modified tags for the resource.
        public let tags: [Tag]

        public init(resourceARN: String, tags: [Tag]) {
            self.resourceARN = resourceARN
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceARN, name: "resourceARN", parent: name, max: 1011)
            try self.validate(self.resourceARN, name: "resourceARN", parent: name, min: 1)
            try self.tags.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct TagResourceResponse: AWSDecodableShape {
        public init() {}
    }

    public struct TimeBasedCollectionScheme: AWSEncodableShape & AWSDecodableShape {
        /// The time period (in milliseconds) to decide how often to collect data. For example, if the time period is 60000, the Edge Agent software collects data once every minute.
        public let periodMs: Int64

        public init(periodMs: Int64) {
            self.periodMs = periodMs
        }

        public func validate(name: String) throws {
            try self.validate(self.periodMs, name: "periodMs", parent: name, max: 60000)
            try self.validate(self.periodMs, name: "periodMs", parent: name, min: 10000)
        }

        private enum CodingKeys: String, CodingKey {
            case periodMs
        }
    }

    public struct TimestreamRegistrationResponse: AWSDecodableShape {
        /// A message associated with a registration error.
        public let errorMessage: String?
        /// The status of registering your Amazon Timestream resources. The status can be one of REGISTRATION_SUCCESS, REGISTRATION_PENDING, REGISTRATION_FAILURE.
        public let registrationStatus: RegistrationStatus
        /// The Amazon Resource Name (ARN) of the Timestream database.
        public let timestreamDatabaseArn: String?
        /// The name of the Timestream database.
        public let timestreamDatabaseName: String
        /// The ARN of the Timestream database table.
        public let timestreamTableArn: String?
        /// The name of the Timestream database table.
        public let timestreamTableName: String

        public init(errorMessage: String? = nil, registrationStatus: RegistrationStatus, timestreamDatabaseArn: String? = nil, timestreamDatabaseName: String, timestreamTableArn: String? = nil, timestreamTableName: String) {
            self.errorMessage = errorMessage
            self.registrationStatus = registrationStatus
            self.timestreamDatabaseArn = timestreamDatabaseArn
            self.timestreamDatabaseName = timestreamDatabaseName
            self.timestreamTableArn = timestreamTableArn
            self.timestreamTableName = timestreamTableName
        }

        private enum CodingKeys: String, CodingKey {
            case errorMessage
            case registrationStatus
            case timestreamDatabaseArn
            case timestreamDatabaseName
            case timestreamTableArn
            case timestreamTableName
        }
    }

    public struct TimestreamResources: AWSEncodableShape & AWSDecodableShape {
        /// The name of the registered Amazon Timestream database.
        public let timestreamDatabaseName: String
        /// The name of the registered Amazon Timestream database table.
        public let timestreamTableName: String

        public init(timestreamDatabaseName: String, timestreamTableName: String) {
            self.timestreamDatabaseName = timestreamDatabaseName
            self.timestreamTableName = timestreamTableName
        }

        public func validate(name: String) throws {
            try self.validate(self.timestreamDatabaseName, name: "timestreamDatabaseName", parent: name, max: 255)
            try self.validate(self.timestreamDatabaseName, name: "timestreamDatabaseName", parent: name, min: 3)
            try self.validate(self.timestreamDatabaseName, name: "timestreamDatabaseName", parent: name, pattern: "^[a-zA-Z0-9_.-]+$")
            try self.validate(self.timestreamTableName, name: "timestreamTableName", parent: name, max: 255)
            try self.validate(self.timestreamTableName, name: "timestreamTableName", parent: name, min: 3)
            try self.validate(self.timestreamTableName, name: "timestreamTableName", parent: name, pattern: "^[a-zA-Z0-9_.-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case timestreamDatabaseName
            case timestreamTableName
        }
    }

    public struct UntagResourceRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "resourceARN", location: .querystring("resourceArn")),
            AWSMemberEncoding(label: "tagKeys", location: .querystring("tagKeys"))
        ]

        /// The ARN of the resource.
        public let resourceARN: String
        /// A list of the keys of the tags to be removed from the resource.
        public let tagKeys: [String]

        public init(resourceARN: String, tagKeys: [String]) {
            self.resourceARN = resourceARN
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceARN, name: "resourceARN", parent: name, max: 1011)
            try self.validate(self.resourceARN, name: "resourceARN", parent: name, min: 1)
            try self.tagKeys.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
            }
            try self.validate(self.tagKeys, name: "tagKeys", parent: name, max: 200)
        }

        private enum CodingKeys: CodingKey {}
    }

    public struct UntagResourceResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateCampaignRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  Specifies how to update a campaign. The action can be one of the following:    APPROVE - To approve delivering a data collection scheme to vehicles.     SUSPEND - To suspend collecting signal data.     RESUME - To resume collecting signal data.     UPDATE - To update a campaign.
        public let action: UpdateCampaignAction
        ///  A list of vehicle attributes to associate with a signal.  Default: An empty array
        public let dataExtraDimensions: [String]?
        /// The description of the campaign.
        public let description: String?
        ///  The name of the campaign to update.
        public let name: String

        public init(action: UpdateCampaignAction, dataExtraDimensions: [String]? = nil, description: String? = nil, name: String) {
            self.action = action
            self.dataExtraDimensions = dataExtraDimensions
            self.description = description
            self.name = name
        }

        public func validate(name: String) throws {
            try self.dataExtraDimensions?.forEach {
                try validate($0, name: "dataExtraDimensions[]", parent: name, max: 150)
                try validate($0, name: "dataExtraDimensions[]", parent: name, min: 1)
                try validate($0, name: "dataExtraDimensions[]", parent: name, pattern: "^[a-zA-Z0-9_.]+$")
            }
            try self.validate(self.dataExtraDimensions, name: "dataExtraDimensions", parent: name, max: 5)
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case action
            case dataExtraDimensions
            case description
        }
    }

    public struct UpdateCampaignResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the campaign.
        public let arn: String?
        /// The name of the updated campaign.
        public let name: String?
        /// The state of a campaign. The status can be one of:    CREATING - Amazon Web Services IoT FleetWise is processing your request to create the campaign.     WAITING_FOR_APPROVAL - After a campaign is created, it enters the WAITING_FOR_APPROVAL state. To allow Amazon Web Services IoT FleetWise to deploy the campaign to the target vehicle or fleet, use the  API operation to approve the campaign.     RUNNING - The campaign is active.     SUSPENDED - The campaign is suspended. To resume the campaign, use the  API operation.
        public let status: CampaignStatus?

        public init(arn: String? = nil, name: String? = nil, status: CampaignStatus? = nil) {
            self.arn = arn
            self.name = name
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
            case status
        }
    }

    public struct UpdateDecoderManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  A brief description of the decoder manifest to update.
        public let description: String?
        ///  The name of the decoder manifest to update.
        public let name: String
        ///  A list of information about the network interfaces to add to the decoder manifest.
        public let networkInterfacesToAdd: [NetworkInterface]?
        ///  A list of network interfaces to remove from the decoder manifest.
        public let networkInterfacesToRemove: [String]?
        ///  A list of information about the network interfaces to update in the decoder manifest.
        public let networkInterfacesToUpdate: [NetworkInterface]?
        ///  A list of information about decoding additional signals to add to the decoder manifest.
        public let signalDecodersToAdd: [SignalDecoder]?
        ///  A list of signal decoders to remove from the decoder manifest.
        public let signalDecodersToRemove: [String]?
        ///  A list of updated information about decoding signals to update in the decoder manifest.
        public let signalDecodersToUpdate: [SignalDecoder]?
        ///  The state of the decoder manifest. If the status is ACTIVE, the decoder manifest can't be edited. If the status is DRAFT, you can edit the decoder manifest.
        public let status: ManifestStatus?

        public init(description: String? = nil, name: String, networkInterfacesToAdd: [NetworkInterface]? = nil, networkInterfacesToRemove: [String]? = nil, networkInterfacesToUpdate: [NetworkInterface]? = nil, signalDecodersToAdd: [SignalDecoder]? = nil, signalDecodersToRemove: [String]? = nil, signalDecodersToUpdate: [SignalDecoder]? = nil, status: ManifestStatus? = nil) {
            self.description = description
            self.name = name
            self.networkInterfacesToAdd = networkInterfacesToAdd
            self.networkInterfacesToRemove = networkInterfacesToRemove
            self.networkInterfacesToUpdate = networkInterfacesToUpdate
            self.signalDecodersToAdd = signalDecodersToAdd
            self.signalDecodersToRemove = signalDecodersToRemove
            self.signalDecodersToUpdate = signalDecodersToUpdate
            self.status = status
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.networkInterfacesToAdd?.forEach {
                try $0.validate(name: "\(name).networkInterfacesToAdd[]")
            }
            try self.validate(self.networkInterfacesToAdd, name: "networkInterfacesToAdd", parent: name, max: 500)
            try self.validate(self.networkInterfacesToAdd, name: "networkInterfacesToAdd", parent: name, min: 1)
            try self.networkInterfacesToRemove?.forEach {
                try validate($0, name: "networkInterfacesToRemove[]", parent: name, max: 50)
                try validate($0, name: "networkInterfacesToRemove[]", parent: name, min: 1)
            }
            try self.validate(self.networkInterfacesToRemove, name: "networkInterfacesToRemove", parent: name, max: 500)
            try self.validate(self.networkInterfacesToRemove, name: "networkInterfacesToRemove", parent: name, min: 1)
            try self.networkInterfacesToUpdate?.forEach {
                try $0.validate(name: "\(name).networkInterfacesToUpdate[]")
            }
            try self.validate(self.networkInterfacesToUpdate, name: "networkInterfacesToUpdate", parent: name, max: 500)
            try self.validate(self.networkInterfacesToUpdate, name: "networkInterfacesToUpdate", parent: name, min: 1)
            try self.signalDecodersToAdd?.forEach {
                try $0.validate(name: "\(name).signalDecodersToAdd[]")
            }
            try self.validate(self.signalDecodersToAdd, name: "signalDecodersToAdd", parent: name, max: 500)
            try self.validate(self.signalDecodersToAdd, name: "signalDecodersToAdd", parent: name, min: 1)
            try self.signalDecodersToRemove?.forEach {
                try validate($0, name: "signalDecodersToRemove[]", parent: name, max: 150)
                try validate($0, name: "signalDecodersToRemove[]", parent: name, min: 1)
            }
            try self.validate(self.signalDecodersToRemove, name: "signalDecodersToRemove", parent: name, max: 500)
            try self.validate(self.signalDecodersToRemove, name: "signalDecodersToRemove", parent: name, min: 1)
            try self.signalDecodersToUpdate?.forEach {
                try $0.validate(name: "\(name).signalDecodersToUpdate[]")
            }
            try self.validate(self.signalDecodersToUpdate, name: "signalDecodersToUpdate", parent: name, max: 500)
            try self.validate(self.signalDecodersToUpdate, name: "signalDecodersToUpdate", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case networkInterfacesToAdd
            case networkInterfacesToRemove
            case networkInterfacesToUpdate
            case signalDecodersToAdd
            case signalDecodersToRemove
            case signalDecodersToUpdate
            case status
        }
    }

    public struct UpdateDecoderManifestResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the updated decoder manifest.
        public let arn: String
        ///  The name of the updated decoder manifest.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct UpdateFleetRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "fleetId", location: .uri("fleetId"))
        ]

        ///  An updated description of the fleet.
        public let description: String?
        ///  The ID of the fleet to update.
        public let fleetId: String

        public init(description: String? = nil, fleetId: String) {
            self.description = description
            self.fleetId = fleetId
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.fleetId, name: "fleetId", parent: name, max: 100)
            try self.validate(self.fleetId, name: "fleetId", parent: name, min: 1)
            try self.validate(self.fleetId, name: "fleetId", parent: name, pattern: "^[a-zA-Z0-9:_-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case description
        }
    }

    public struct UpdateFleetResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the updated fleet.
        public let arn: String?
        /// The ID of the updated fleet.
        public let id: String?

        public init(arn: String? = nil, id: String? = nil) {
            self.arn = arn
            self.id = id
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case id
        }
    }

    public struct UpdateModelManifestRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  A brief description of the vehicle model.
        public let description: String?
        ///  The name of the vehicle model to update.
        public let name: String
        ///  A list of fullyQualifiedName of nodes, which are a general abstraction of signals, to add to the vehicle model.
        public let nodesToAdd: [String]?
        ///  A list of fullyQualifiedName of nodes, which are a general abstraction of signals, to remove from the vehicle model.
        public let nodesToRemove: [String]?
        ///  The state of the vehicle model. If the status is ACTIVE, the vehicle model can't be edited. If the status is DRAFT, you can edit the vehicle model.
        public let status: ManifestStatus?

        public init(description: String? = nil, name: String, nodesToAdd: [String]? = nil, nodesToRemove: [String]? = nil, status: ManifestStatus? = nil) {
            self.description = description
            self.name = name
            self.nodesToAdd = nodesToAdd
            self.nodesToRemove = nodesToRemove
            self.status = status
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.nodesToAdd?.forEach {
                try validate($0, name: "nodesToAdd[]", parent: name, max: 150)
                try validate($0, name: "nodesToAdd[]", parent: name, min: 1)
                try validate($0, name: "nodesToAdd[]", parent: name, pattern: "^[a-zA-Z0-9_.]+$")
            }
            try self.validate(self.nodesToAdd, name: "nodesToAdd", parent: name, max: 500)
            try self.validate(self.nodesToAdd, name: "nodesToAdd", parent: name, min: 1)
            try self.nodesToRemove?.forEach {
                try validate($0, name: "nodesToRemove[]", parent: name, max: 150)
                try validate($0, name: "nodesToRemove[]", parent: name, min: 1)
                try validate($0, name: "nodesToRemove[]", parent: name, pattern: "^[a-zA-Z0-9_.]+$")
            }
            try self.validate(self.nodesToRemove, name: "nodesToRemove", parent: name, max: 500)
            try self.validate(self.nodesToRemove, name: "nodesToRemove", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case nodesToAdd
            case nodesToRemove
            case status
        }
    }

    public struct UpdateModelManifestResponse: AWSDecodableShape {
        ///  The Amazon Resource Name (ARN) of the updated vehicle model.
        public let arn: String
        ///  The name of the updated vehicle model.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct UpdateSignalCatalogRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "name", location: .uri("name"))
        ]

        ///  A brief description of the signal catalog to update.
        public let description: String?
        ///  The name of the signal catalog to update.
        public let name: String
        ///  A list of information about nodes to add to the signal catalog.
        public let nodesToAdd: [Node]?
        ///  A list of fullyQualifiedName of nodes to remove from the signal catalog.
        public let nodesToRemove: [String]?
        ///  A list of information about nodes to update in the signal catalog.
        public let nodesToUpdate: [Node]?

        public init(description: String? = nil, name: String, nodesToAdd: [Node]? = nil, nodesToRemove: [String]? = nil, nodesToUpdate: [Node]? = nil) {
            self.description = description
            self.name = name
            self.nodesToAdd = nodesToAdd
            self.nodesToRemove = nodesToRemove
            self.nodesToUpdate = nodesToUpdate
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 2048)
            try self.validate(self.description, name: "description", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, pattern: "^[^\\u0000-\\u001F\\u007F]+$")
            try self.validate(self.name, name: "name", parent: name, max: 100)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
            try self.nodesToAdd?.forEach {
                try $0.validate(name: "\(name).nodesToAdd[]")
            }
            try self.validate(self.nodesToAdd, name: "nodesToAdd", parent: name, max: 500)
            try self.nodesToRemove?.forEach {
                try validate($0, name: "nodesToRemove[]", parent: name, max: 150)
                try validate($0, name: "nodesToRemove[]", parent: name, min: 1)
                try validate($0, name: "nodesToRemove[]", parent: name, pattern: "^[a-zA-Z0-9_.]+$")
            }
            try self.validate(self.nodesToRemove, name: "nodesToRemove", parent: name, max: 500)
            try self.validate(self.nodesToRemove, name: "nodesToRemove", parent: name, min: 1)
            try self.nodesToUpdate?.forEach {
                try $0.validate(name: "\(name).nodesToUpdate[]")
            }
            try self.validate(self.nodesToUpdate, name: "nodesToUpdate", parent: name, max: 500)
        }

        private enum CodingKeys: String, CodingKey {
            case description
            case nodesToAdd
            case nodesToRemove
            case nodesToUpdate
        }
    }

    public struct UpdateSignalCatalogResponse: AWSDecodableShape {
        ///  The ARN of the updated signal catalog.
        public let arn: String
        ///  The name of the updated signal catalog.
        public let name: String

        public init(arn: String, name: String) {
            self.arn = arn
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case name
        }
    }

    public struct UpdateVehicleError: AWSDecodableShape {
        /// The relevant HTTP error code (400+).
        public let code: Int?
        /// A message associated with the error.
        public let message: String?
        /// The ID of the vehicle with the error.
        public let vehicleName: String?

        public init(code: Int? = nil, message: String? = nil, vehicleName: String? = nil) {
            self.code = code
            self.message = message
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case code
            case message
            case vehicleName
        }
    }

    public struct UpdateVehicleRequest: AWSEncodableShape {
        public static var _encoding = [
            AWSMemberEncoding(label: "vehicleName", location: .uri("vehicleName"))
        ]

        /// Static information about a vehicle in a key-value pair. For example:  "engineType" : "1.3 L R2"
        public let attributes: [String: String]?
        /// The method the specified attributes will update the existing attributes on the vehicle. UseOverwite to replace the vehicle attributes with the specified attributes. Or use Merge to combine all attributes. This is required if attributes are present in the input.
        public let attributeUpdateMode: UpdateMode?
        /// The ARN of the decoder manifest associated with this vehicle.
        public let decoderManifestArn: String?
        /// The ARN of a vehicle model (model manifest) associated with the vehicle.
        public let modelManifestArn: String?
        /// The unique ID of the vehicle to update.
        public let vehicleName: String

        public init(attributes: [String: String]? = nil, attributeUpdateMode: UpdateMode? = nil, decoderManifestArn: String? = nil, modelManifestArn: String? = nil, vehicleName: String) {
            self.attributes = attributes
            self.attributeUpdateMode = attributeUpdateMode
            self.decoderManifestArn = decoderManifestArn
            self.modelManifestArn = modelManifestArn
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.attributes?.forEach {
                try validate($0.key, name: "attributes.key", parent: name, max: 150)
                try validate($0.key, name: "attributes.key", parent: name, min: 1)
                try validate($0.key, name: "attributes.key", parent: name, pattern: "^[a-zA-Z0-9_.-]+$")
            }
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case attributes
            case attributeUpdateMode
            case decoderManifestArn
            case modelManifestArn
        }
    }

    public struct UpdateVehicleRequestItem: AWSEncodableShape {
        /// Static information about a vehicle in a key-value pair. For example:  "engineType" : "1.3 L R2"
        public let attributes: [String: String]?
        /// The method the specified attributes will update the existing attributes on the vehicle. UseOverwite to replace the vehicle attributes with the specified attributes. Or use Merge to combine all attributes. This is required if attributes are present in the input.
        public let attributeUpdateMode: UpdateMode?
        /// The ARN of the signal decoder manifest associated with the vehicle to update.
        public let decoderManifestArn: String?
        /// The ARN of the vehicle model (model manifest) associated with the vehicle to update.
        public let modelManifestArn: String?
        /// The unique ID of the vehicle to update.
        public let vehicleName: String

        public init(attributes: [String: String]? = nil, attributeUpdateMode: UpdateMode? = nil, decoderManifestArn: String? = nil, modelManifestArn: String? = nil, vehicleName: String) {
            self.attributes = attributes
            self.attributeUpdateMode = attributeUpdateMode
            self.decoderManifestArn = decoderManifestArn
            self.modelManifestArn = modelManifestArn
            self.vehicleName = vehicleName
        }

        public func validate(name: String) throws {
            try self.attributes?.forEach {
                try validate($0.key, name: "attributes.key", parent: name, max: 150)
                try validate($0.key, name: "attributes.key", parent: name, min: 1)
                try validate($0.key, name: "attributes.key", parent: name, pattern: "^[a-zA-Z0-9_.-]+$")
            }
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, max: 100)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, min: 1)
            try self.validate(self.vehicleName, name: "vehicleName", parent: name, pattern: "^[a-zA-Z\\d\\-_:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case attributes
            case attributeUpdateMode
            case decoderManifestArn
            case modelManifestArn
            case vehicleName
        }
    }

    public struct UpdateVehicleResponse: AWSDecodableShape {
        /// The ARN of the updated vehicle.
        public let arn: String?
        /// The ID of the updated vehicle.
        public let vehicleName: String?

        public init(arn: String? = nil, vehicleName: String? = nil) {
            self.arn = arn
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case vehicleName
        }
    }

    public struct UpdateVehicleResponseItem: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the updated vehicle.
        public let arn: String?
        /// The unique ID of the updated vehicle.
        public let vehicleName: String?

        public init(arn: String? = nil, vehicleName: String? = nil) {
            self.arn = arn
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case vehicleName
        }
    }

    public struct VehicleStatus: AWSDecodableShape {
        /// The name of a campaign.
        public let campaignName: String?
        /// The state of a vehicle, which can be one of the following:    CREATED - Amazon Web Services IoT FleetWise sucessfully created the vehicle.     READY - The vehicle is ready to receive a campaign deployment.     HEALTHY - A campaign deployment was delivered to the vehicle.     SUSPENDED - A campaign associated with the vehicle was suspended and data collection was paused.     DELETING - Amazon Web Services IoT FleetWise is removing a campaign from the vehicle.
        public let status: VehicleState?
        /// The unique ID of the vehicle.
        public let vehicleName: String?

        public init(campaignName: String? = nil, status: VehicleState? = nil, vehicleName: String? = nil) {
            self.campaignName = campaignName
            self.status = status
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case campaignName
            case status
            case vehicleName
        }
    }

    public struct VehicleSummary: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the vehicle.
        public let arn: String
        /// The time the vehicle was created in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let creationTime: Date
        /// The ARN of a decoder manifest associated with the vehicle.
        public let decoderManifestArn: String
        /// The time the vehicle was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).
        public let lastModificationTime: Date
        /// The ARN of a vehicle model (model manifest) associated with the vehicle.
        public let modelManifestArn: String
        /// The unique ID of the vehicle.
        public let vehicleName: String

        public init(arn: String, creationTime: Date, decoderManifestArn: String, lastModificationTime: Date, modelManifestArn: String, vehicleName: String) {
            self.arn = arn
            self.creationTime = creationTime
            self.decoderManifestArn = decoderManifestArn
            self.lastModificationTime = lastModificationTime
            self.modelManifestArn = modelManifestArn
            self.vehicleName = vehicleName
        }

        private enum CodingKeys: String, CodingKey {
            case arn
            case creationTime
            case decoderManifestArn
            case lastModificationTime
            case modelManifestArn
            case vehicleName
        }
    }

    public struct FormattedVss: AWSEncodableShape {
        /// Provides the VSS in JSON format.
        public let vssJson: String?

        public init(vssJson: String? = nil) {
            self.vssJson = vssJson
        }

        private enum CodingKeys: String, CodingKey {
            case vssJson
        }
    }

    public struct NetworkFileDefinition: AWSEncodableShape {
        /// Information, including CAN DBC files, about the configurations used to create a decoder manifest.
        public let canDbc: CanDbcDefinition?

        public init(canDbc: CanDbcDefinition? = nil) {
            self.canDbc = canDbc
        }

        public func validate(name: String) throws {
            try self.canDbc?.validate(name: "\(name).canDbc")
        }

        private enum CodingKeys: String, CodingKey {
            case canDbc
        }
    }
}

// MARK: - Errors

/// Error enum for IoTFleetWise
public struct IoTFleetWiseErrorType: AWSErrorType {
    enum Code: String {
        case accessDeniedException = "AccessDeniedException"
        case conflictException = "ConflictException"
        case decoderManifestValidationException = "DecoderManifestValidationException"
        case internalServerException = "InternalServerException"
        case invalidNodeException = "InvalidNodeException"
        case invalidSignalsException = "InvalidSignalsException"
        case limitExceededException = "LimitExceededException"
        case resourceNotFoundException = "ResourceNotFoundException"
        case throttlingException = "ThrottlingException"
        case validationException = "ValidationException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize IoTFleetWise
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// You don&#39;t have sufficient permission to perform this action.
    public static var accessDeniedException: Self { .init(.accessDeniedException) }
    /// The request has conflicting operations. This can occur if you&#39;re trying to perform more than one operation on the same resource at the same time.
    public static var conflictException: Self { .init(.conflictException) }
    /// The request couldn&#39;t be completed because it contains signal decoders with one or more validation errors.
    public static var decoderManifestValidationException: Self { .init(.decoderManifestValidationException) }
    /// The request couldn&#39;t be completed because the server temporarily failed.
    public static var internalServerException: Self { .init(.internalServerException) }
    /// The specified node type doesn&#39;t match the expected node type for a node. You can specify the node type as branch, sensor, actuator, or attribute.
    public static var invalidNodeException: Self { .init(.invalidNodeException) }
    /// The request couldn&#39;t be completed because it contains signals that aren&#39;t valid.
    public static var invalidSignalsException: Self { .init(.invalidSignalsException) }
    /// A service quota was exceeded.
    public static var limitExceededException: Self { .init(.limitExceededException) }
    /// The resource wasn&#39;t found.
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// The request couldn&#39;t be completed due to throttling.
    public static var throttlingException: Self { .init(.throttlingException) }
    /// The input fails to satisfy the constraints specified by an Amazon Web Services service.
    public static var validationException: Self { .init(.validationException) }
}

extension IoTFleetWiseErrorType: Equatable {
    public static func == (lhs: IoTFleetWiseErrorType, rhs: IoTFleetWiseErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension IoTFleetWiseErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
